C++相談室 part161

■ このスレッドは過去ログ倉庫に格納されています
2022/05/21(土) 21:23:29.59ID:kYXfaM+5
前スレ
C++相談室 part160
https://mevius.5ch.net/test/read.cgi/tech/1649979572/
2022/05/22(日) 19:52:14.59ID:rj0GqvkC
>>7
>インライン関数は同じアドレスを持つ (事実上統合することの要求)

それはもうインラインではないですね…
そうではなくて、extern なインライン関数をリンクする際には、同一のアドレスであるべき、という意味でしかないでしょう、つまり私の実装案

https://mevius.5ch.net/test/read.cgi/tech/1649979572/996
>実装的には inline のついた関数定義が外部にリンクされる可能性があれば、すなわち extern な iniline 関数があれば、リンクのためのコード体を、各所に inline に展開されるコード体とは別に(こっそり)用意しておく、見たいな感じで十分に実装可能ですね

を支持する内容であり、extern な inline 関数において定義を持たないコンパイル単位にでは inline の指示があっても inline しなくてもいいといっているに等しいですね‥‥

7.1.2.4
(略)外部リンクをもつインライン関数は、すべての翻訳単位で同じアドレスを持たなければならない。
外部インライン関数内の静的ローカル変数は、常に同じオブジェクトを参照する。
externインライン関数の本体内の文字列リテラルは、異なる翻訳単位で同じオブジェクトを指す。
2022/05/22(日) 20:04:27.44ID:9X/55aF0
>>9
見かけ上は同一に見える (アドレスを取らずに呼び出すときに限ってインライン化できる) ことを保証するという意味だよ。
インライン化できる条件を整えておきたいということと矛盾しない。
2022/05/22(日) 20:07:42.95ID:ZvvsRMN9
>>8
俺が通ってる外国のコミュニティでその質問が出ると毎回Visual StudioでFA?って回答が帰ってくる
ネタで言ってるのか本気で言ってるのかは知らない
2022/05/22(日) 20:15:45.42ID:9X/55aF0
>>8
人によって使いやすさって違うからアドオンとかドキュメントの量とかが重要になってくるんだよ。
いくら潜在的に良い出来栄えであってもちょっとしたカスタムを全部自分で書かなきゃならないようでは面倒くさすぎる。
どこをどういじればいいのかいちいちソースコードを見ないとわからないのではダルい。
なんだかんだ不満があってもユーザ人口の多いものは全体としては良い選択になりがち。 物量重要。
2022/05/22(日) 20:19:45.26ID:sBUJB3wj
vs以外だとIDEっていうよりエディタとコマンドでやってるイメージ
ボーランドとか死にかけだしなあ
2022/05/22(日) 20:25:35.21ID:9X/55aF0
>>13
LSP が現れたせいで処理系と統合された開発環境の価値が薄れた感がある。
15デフォルトの名無しさん
垢版 |
2022/05/22(日) 20:37:44.89ID:WUnKKX5R
>>11
ググった感じだと海外では無料版が多いように感じたw

>>12
日本も海外もEclipseとかが人気みたいなのでEclipseから使っていきます

レスサンクスです
2022/05/22(日) 20:39:19.63ID:rj0GqvkC
>>10
つまり >>9 に同意する、ってことでしょう?
2022/05/22(日) 20:50:26.55ID:9X/55aF0
>>16
>>9
> 定義を持たないコンパイル単位にでは inline の指示があっても inline しなくてもいいといっているに等しい
が結論だとしたらそう。 同意する。
むしろ定義を持つ翻訳単位でもインライン化しなくていい。

だから残る inline の意味は ODR の例外として機能するって部分になるわけ。
2022/05/22(日) 22:42:48.81ID:rj0GqvkC
>>17
なるほど。私の元の主張に反するのですが、規格上はそのように誘導されてしまうのですね…‥(呆然)
2022/05/22(日) 22:53:10.16ID:j/hmX3ds
www.youtube.com/watch?v=uaUmAUMvs2o
20デフォルトの名無しさん
垢版 |
2022/05/28(土) 13:34:18.53ID:kIghR+Cp
C++入門書でオススメがあったら教えてください
2022/05/28(土) 13:51:21.59ID:y4EmUyIA
昔からC++を使ってる人が多いから最近の入門書なんて誰も知らん
https://cppmap.github.io/learn/books/
22デフォルトの名無しさん
垢版 |
2022/05/28(土) 14:07:22.40ID:kIghR+Cp
>>21
多謝多謝!
2022/05/28(土) 15:19:08.43ID:72vE6z5l
禿本の5、来ないね・・・
2022/05/28(土) 15:44:53.73ID:IqCM7SI4
C++ はそれなりに歴史が長いから仕様も変わってるし思想や習慣の変化もある。

上述で私は「inline は ODR の例外の意味!」と主張したけどさ、 D&E を読むと (inline 指定導入初期の判断としては)
「コンパイラによるインライン化の判断がザコなので指定できるようにした」
という意味のことを書いてあって、大元はやっぱりインライン化の指定なんだよね……。

色んな事情が絡むし、単純に C++ が巨大なのでどうせ一冊でちゃんとした理解にはならないと思う。
適当なやつをどれから読み始めてもいいんじゃないかね。
まあ、あまり古い奴は避けた方がよいだろうというのが最低限の基準かな。
2022/05/28(土) 16:12:25.28ID:m/lYnlWz
C 言語でなぜかC++のコメント行がいつの間にか許されている不思議
2022/05/28(土) 16:25:05.55ID:gMoQJtfo
なぜかってC99でサポートされたからではなくて?
27デフォルトの名無しさん
垢版 |
2022/05/28(土) 17:21:17.26ID:DrsyU/Zk
違うでしょうなあ。
2022/05/28(土) 19:31:09.65ID:72vE6z5l
> いつの間に

情弱からはこう見えるようだな
2022/05/28(土) 20:36:31.97ID:HcUv+Nxj
>>24
ふむふむ。なかなか一筋縄ではいかない大人の事情ってのがてんこ盛り、ってことですね
私もそろそろ C++ をやり直そうかな‥‥
2022/05/31(火) 21:24:16.90ID:YEMisgK+
このコードがコンパイルできないんだけど、なんで?
struct hoge {
std::map<int, std::unique_ptr<struct hoge>> m = {};
void x() {
struct hoge &r = *this;
r = *(m.begin()->second.get()); // ここがまずい
}
};
2022/05/31(火) 21:37:16.47ID:Cpwrpvdc
コピーコンストラクタが呼ばれて、最終的にmapのunique_ptrがコピーできないってことか。。。
C++98の人間だし10年以上離れてたから最近のC++まったくわからんわ・・・
2022/05/31(火) 21:49:44.41ID:prs/eEEO
>>30
あたりめえだろ
バカかお前
2022/05/31(火) 22:00:19.02ID:eSF5ElRz
rは*thisの別名。
*thisの所有物を*thisにコピー。だめ。
*thisよりも高位じゃないと。。。
2022/05/31(火) 22:30:18.12ID:+LJ4L5Ht
根拠。
https://timsong-cpp.github.io/cppwp/n3337/container.requirements#tab:containers.allocatoraware

コンテナを代入するとき、コンテナの要素の型は CopyAssignable であり、
コンテナに対して CopyInsertable であることを要求する。
2022/05/31(火) 23:45:41.75ID:xnVZpK0y
>>(前スレ)695
のFFTで2^(2^34)-1を計算する奴
https://ideone.com/xSaa6x
を倍速で動くようにしたったわ……!
↓↓↓
https://ideone.com/q0O74K

オリジナルが2200秒なところを962秒で計算完了
出力結果は一致
メモリ消費量はオリジナルと同等(完全in-place、sinテーブルは1GB(計算時間と誤差が劣化するがシュリンク可能))
2022/05/31(火) 23:48:59.95ID:xnVZpK0y
さすがに天才の漏れも三角関数って何だっけというあたりからスタートしたので
日数がかかってしまったが、いまやバッタフライ演算を完全に理解したから
純アルゴリズム的には最善の実装になっていると言える(希ガス、

(参考)
基礎からの周波数分析(9)-「高速フーリエ変換(FFT)」
https://www.onosokki.co.jp/HP-WK/eMM_back/emm140.pdf

あとはメモリアクセスの時間局所性を改善して1000倍にする、
2022/06/01(水) 00:23:05.24ID:0xwrfx4r
こういうのに燃えてるような人が日本を支えていたのかもな
38デフォルトの名無しさん
垢版 |
2022/06/01(水) 07:38:09.36ID:g+4BWW21
過去形でワロタ
2022/06/01(水) 08:08:59.08ID:X1odZl5o
スペアナ以外に使い道あるのか
2022/06/01(水) 09:38:46.33ID:0/3ltNwW
>>37
アホか
数論変換も知らんゴミが夏休みの自由研究やってるだけ
2022/06/01(水) 10:00:14.05ID:vvQTEkHX
>>36
漏れや希ガスというタイポや、バタフライ演算とかいう大学2年の信号処理の課題で出る程度のアルゴリズムを自信満々に書いちゃうあたり、かわいそうな人なのかな
2022/06/01(水) 10:09:19.65ID:IxX6jh1U
その辺はタイポじゃなくて20年近く前の2ch語なのじゃ……
イタいことには変わりないが
2022/06/01(水) 10:31:05.57ID:RHCtS9cS
41がむしろ異常にみえる
2022/06/01(水) 10:39:26.49ID:m3Paz3vX
最近は大学2年で信号処理やってるのかい?
2022/06/01(水) 11:39:44.35ID:vvQTEkHX
>>44
うちは二年前期の専門科目だった
2022/06/01(水) 11:40:41.11ID:XFKMacmT
>>43
どう異常に見えるのか書いてない時点で…
2022/06/01(水) 13:51:18.40ID:pJ9e03Xl
template <class T> void F(const T &t){ auto x = t; }
って関数があった場合、autoで推論(導出?)されるxの方はconst T&になるの?
ついでにここらへん分かりやすい資料があったら教えてほしい。
2022/06/01(水) 14:22:19.84ID:YMgHeGpL
>>47
テンプレートの実引数推論と同じ規則が適用される。
つまり
template<class U> void foo(U u);
というテンプレートが仮にあったとして、これに
foo(t);
としたときの U の型がその場合の x の型になる。
故に x の型は T であって const も参照もつかない。
49デフォルトの名無しさん
垢版 |
2022/06/01(水) 22:01:40.23ID:g+4BWW21
auto&にすればconst参照も推論されるし、右辺値も取り得るならauto&&にしておけば間違い無いんだっけ
2022/06/01(水) 22:56:35.59ID:YMgHeGpL
auto& x = t;
と書いた場合には上述 (>>48) の規則に当てはめると
template<class U> void foo(U& u);
と同等の推論をするし、
auto&& x = t;
と書いた場合には
template<class U> void foo(U&& u);
と同じ推論になるわけだね。
2022/06/02(木) 02:04:50.78ID:uWYOiZpw
じゃぁ、あらゆる場面でauto&&と書くのはあり?
2022/06/02(木) 08:19:43.47ID:X8QTJG9M
駄目
53デフォルトの名無しさん
垢版 |
2022/06/02(木) 10:55:52.02ID:MPFVtYTL
>>36
>>44-45
https://www.youtube.com/watch?v=sxkwdvuLHw4&list=PLmhf46XKsdmRM_cR4WBcO5fMPZ5d-L1YA
54デフォルトの名無しさん
垢版 |
2022/06/02(木) 10:56:54.96ID:MPFVtYTL
バッタフライってバッタとハエのことか
2022/06/02(木) 11:39:13.84ID:2jh3vW7l
バッタのフライだよ
昆虫食
2022/06/02(木) 22:50:27.49ID:W32R/zzX
>>37-46
んまー藻前らの言う通り
>>(前スレ)695 のオリジナルのプログラムが書き方が変にIQ高すぎたせいで
漏れが普通に書いたプログラムの方が速かったということかもしれませ
んね、

しかしこれをここから2^3倍にするというのが真の天才の仕事なので
ご気体くだち、
2022/06/02(木) 22:51:31.90ID:W32R/zzX
なお^がべきなのか排他的論理和なのかは結果を見て決める、
2022/06/03(金) 06:03:05.77ID:2JsQlaOH
operator^をべきにするやついたら当然シバくよな
59デフォルトの名無しさん
垢版 |
2022/06/03(金) 06:10:12.11ID:3ErUtwIg
addメンバ関数の引数(x)の所有権を、クラスの中の配列(vec)に移動させたい場合、std::moveをどこで使えばいいかわかりません。

struct A{
 vector<vector<int>> vec;
 void add(vector<int> &&x){
  ここで、std::moveを使ってpush_backに渡すべきか、渡さなくてもよいのか、わかりません。
  1) vec.push_back(std::move(x));
  2) vec.push_back(x);
  どっちが正なのか?・・・
};
〜〜〜〜
vector<int> x;
A a;
a.add(std::move(x));
2022/06/03(金) 07:50:26.34ID:AsLopwGr
moveでなくてforwardが正しいです
2022/06/03(金) 08:54:35.11ID:I7UEGKwl
>>59 move 使わないと移動しないでしょ。アドレス見るなりして確認できるはず。
>>60 「移動させたい」と言ってるんだから move で正しいでしょ。
2022/06/03(金) 09:14:32.48ID:wV0TqfjJ
>>56
相変わらずタイポしてて草
2022/06/03(金) 09:33:30.85ID:ysQR9TY9
>>59
C++ の常識的な設計としてはには >>60 が主張するように forward を使うべき。
右辺値か左辺値かによって適切に切り替えが成されるので。

「常に」ムーブさせたいのであれば >>61 の述べる通りだが、
その場合は a.add(std::move(x)); の move は不要。 (有っても害はないが……。)
左辺値でも add がムーブするなら右辺値にキャストする意味はない。
2022/06/03(金) 09:48:25.29ID:IxeUpLcv
push_backが適切にやってくれるだろうし素人がここで手入れするところではないな
2022/06/03(金) 09:49:48.62ID:I7UEGKwl
>>63 a.add(std::move(x)) の move 外したらコンパイルエラーになるでしょ。
2022/06/03(金) 09:56:37.41ID:IxeUpLcv
そりゃド素人が作成した自作関数に&&しか定義してないからでしょ
2022/06/03(金) 09:59:10.91ID:ysQR9TY9
>>65
ああそうか、すまん。
変な思い違いをしていた。
2022/06/03(金) 11:21:49.67ID:2JsQlaOH
xをコンストラクタに渡すならemplaceじゃね?
6959
垢版 |
2022/06/03(金) 14:58:35.62ID:3oYQiySt
これでいいってことですか?
void add(vector<int> &&x){
 vec.push_back(std::forward(x));
};

あと、
>「常に」ムーブさせたい
という言葉が気になるんですが、右辺値を受け取る場合に「ムーブさせない」場合があるんでしょうか?
2022/06/03(金) 15:42:06.91ID:g1oXgs2q
引数が forwarding reference になるのは型変数の場合だけ
https://en.cppreference.com/w/cpp/language/reference#Forwarding_references

コンクリートな型の場合 && で取ったら確実に rvalue だから forward は要らん
んで vector<T>#push_back は (const T&) と (T&&) に対してオーバーロードされてるから (後者のバージョンが選ばれるので) move も要らん
つまり >>64 が正解。なんで適当答える前に手元で確認しないのか
2022/06/03(金) 15:44:21.94ID:ysQR9TY9
>>69
ムーブさせない場合はある。

それとは別に可能なら左辺値にも右辺値にも対応するのが通例なので
それを無意識に前提に入れてしまっておかしなことを書いてしまった。
ごめんね。
2022/06/03(金) 16:02:28.52ID:I7UEGKwl
>>70 move しなかったら push_back(const T&) になっちゃうでしょ。なんで適当答える前に(ry
2022/06/03(金) 16:06:42.00ID:g1oXgs2q
>>72

アホか。forwarding reference じゃなくて rvalue reference だっつってんのになる訳ねーだろ
2022/06/03(金) 16:10:12.85ID:g1oXgs2q
あ、もしかして >>59
> a.add(std::move(x));
について言ってんのか?そりゃここには move が要るが今は add の中の話だろ?
75デフォルトの名無しさん
垢版 |
2022/06/03(金) 18:50:26.25ID:lbrgnw5P
>>73
さてはrvalueの挙動理解してないな?
https://wandbox.org/permlink/rtkW4N7gWRu9yyqK

rvalueとして受け取った時点でlvalue扱いなんだよ
moveするまで所有権を持っていて、moveで所有権を放棄する。
所有権はT&&を受け取る関数に移る。
76デフォルトの名無しさん
垢版 |
2022/06/03(金) 19:12:19.64ID:lbrgnw5P
>>69
moveさせるとまずいケースがある
https://wandbox.org/permlink/bdXnNaYzb7esxcwt

moveってのは所有権の移動なので、所有権を他に渡した後に使うとまずい
このコードは手元のgccだとこんな感じに壊れる


forwardは2つのモードがあって、forward<T&>かforward<T&&> (or forward<T>) を指定しなきゃいけない。
T& forward<T&>: moveしない
T&& forward<T&&> (or forward<T>): moveする
2022/06/03(金) 19:43:48.13ID:+R1h67E5
Revive! Vive! unifyde call syntax!! revive!!!
2022/06/04(土) 12:47:58.32ID:TQBK1egQ
cpp経験のあるエンジニアが面接に来たんですがboost知らないとかあり得るんでしょうか
79デフォルトの名無しさん
垢版 |
2022/06/04(土) 13:11:38.01ID:FGCXQeDT
あり得ません、エアプです
2022/06/04(土) 13:13:16.94ID:to7UVp4p
でもC++を完全に理解してるスーパーエンジニアが君の会社に来ることはないんだ
81デフォルトの名無しさん
垢版 |
2022/06/04(土) 13:41:01.98ID:vvbHqYcO
boost知ってても使ってないとか黙殺するとかなら有り得るんじゃね
82デフォルトの名無しさん
垢版 |
2022/06/04(土) 13:51:08.17ID:cj+dvlSK
CとCppは似てるらしいけど最初はCから始めて
基礎を身につけた方がいいとかありますか?
2022/06/04(土) 14:02:22.31ID:1SIgUGMa
まあコンパイル時間が伸びるとかで使わない所も多いしな
2022/06/04(土) 14:05:58.45ID:OQ3usAsV
C++のほうがコンパイル時の文法チェックが親切なので、g++でコンパイルするのが吉
2022/06/04(土) 14:18:00.05ID:Ah6rlskA
余談だけど cpp って書いたら C プリプロセッサのことを指す場合もある。
86デフォルトの名無しさん
垢版 |
2022/06/04(土) 14:37:22.59ID:cj+dvlSK
>>83-85
ありがとうございます!勉強になります!
2022/06/04(土) 14:38:35.97ID:qJZvQBHL
boostつかうひと嫌い
2022/06/04(土) 14:45:24.57ID:wH3cIPcT
マリオカートの遊び方に縛り入れてんじゃねぇよ!
2022/06/04(土) 16:03:47.30ID:OQ3usAsV
今どきの人がCの機能を学ぶにしても、最初のうちはC++コンパイラを使ったほうがいい
C++コンパイラは初心者がやりがちな意図しない型キャストに警告を出してくれる
90デフォルトの名無しさん
垢版 |
2022/06/04(土) 16:44:33.09ID:vvbHqYcO
>>82
その通り
ハゲめ
91デフォルトの名無しさん
垢版 |
2022/06/04(土) 21:34:58.76ID:TQBK1egQ
>>79
やっぱ有り得ないですよね
うちの会社はC++使わないんですが、盛り過ぎた経歴は看過できないので二次面接にはC++経験のあるエンジニアに同席してもらいます
2022/06/04(土) 21:43:09.92ID:OQ3usAsV
>>91
ずっと同じ部署にいてboostライブラリに接する機会がなかっただけじゃないかな
ずっと同じ部署にいたってことは専門性が高くて信頼されてた可能性がある
93デフォルトの名無しさん
垢版 |
2022/06/04(土) 21:48:20.42ID:nRM2q6cY
>>92
はい、私がC++は門外漢すぎて突っ込んだ質問が出来なかった手落ちもあるので、後続の面接ではしっかり見極めたいと思います
C++以外の話でも怪しい部分はありましたし
2022/06/04(土) 22:16:16.74ID:IRaDT1CY
>>83も書いてるけどboost使わない職場はそれなりにあるから俺もboost使える?って聞かれたら使ったことないからよく知らんって答えると思う
そもそもそんな事で採用決めるような会社はこちらから断ると思うが
2022/06/04(土) 22:23:56.45ID:FR2x7OcT
はい、職歴に書かれた内容に曇りがないか見極めたかっだけなので、Boostに知見があるかどうかはさほど問題にしてません
2022/06/04(土) 22:54:17.16ID:cXL4Xuwo
>>78
バカか
boostは標準化されてないだろ
ヘッダ入れ込んでまでわざわざ使うヤツは縛りプレイヤーかマニアだぞ
2022/06/04(土) 22:56:04.77ID:4luU2XzE
>>79はネタで言ってるかエアプだと思うよ
boost役に立つものもあるし個人では使うが、仕事で必須かというとそんなことはない
2022/06/04(土) 22:59:46.47ID:+8Ow3LIK
標準じゃないもん使うのはアホ
人格に問題がある
2022/06/04(土) 23:04:03.58ID:BuoePqDI
知ってるけどあんまり使ってない、使ったことないから詳しくは知らない、とかならまあ別に普通だけど
知らない聞いたことすらないってのはヤバい
2022/06/04(土) 23:12:35.97ID:3rcQlGgA
仕事では使わないなあboost
必須のミドルウェアは使うけど
2022/06/04(土) 23:12:59.31ID:4luU2XzE
>>98
その標準じゃないもん、にはOSのAPIとか目的のソフトに必須のライブラリ群も含んでる?
2022/06/05(日) 00:13:46.63ID:/AT5pgYO
boostもサードパーティのライブラリも使わんて人は、コマンドラインのパーサーとか任意精度のライブラリとか自分で毎回書いてるのか?
正気か?
103デフォルトの名無しさん
垢版 |
2022/06/05(日) 00:46:57.94ID:/ywqNijR
そんな便利なものは存在しないから標準ライブラリ+Win32でどうにかしてるだけじゃね?
2022/06/05(日) 01:30:20.47ID:TqTpE262
boost::sort::block_indirect_sort()はstd::sort()より速いので使ってる
2022/06/05(日) 03:05:51.19ID:IC6BDqn3
>>102
コマンドラインのパーサー含め、その辺の文字列処理は全部自前の文字列クラスでやっちまうな、俺はw
いちいち文字コードがどうたらとか悩みたくないし
2022/06/05(日) 05:03:18.77ID:O5HYGw/G
>>95
c++標準の勉強をしていれば単語としてboostを聞いたことあるだろう。
知らないのなら大した勉強はしていないだろうから、せいぜい業務で通り一辺触ったことがあるくらいじゃないかね。

どこまでのスキル求めているかによるけど、業務内容に近い課題を与えてテストしてみたらいいんじゃない?
業務でc++を使わないなら、c++スキルに金を払うわけじゃないから気にすんな。どうせ募集要項にc++とか書いてないんだろ。
107デフォルトの名無しさん
垢版 |
2022/06/05(日) 06:28:02.59ID:kEvpwCAH
自分の知ってる世界がすべてだと思ってる人間の方が危険。
C++が使われる範囲が広すぎるから、言語の経験有無よりもどの分野で開発してたのかを聞くべき。
ガラケー時代のカーネルドライバ書いてたり、携帯キャリア向け機器の組み込みやってた時はboostどころかstlすら使ってなかった。
というか使えなかった。
一方でスマホゲーのバックエンドを書いてた時はboostまみれだった。
2022/06/05(日) 07:05:01.15ID:xi1K2Yw5
任意精度ってGMP使いませんか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況