[過去ログ] C++相談室 part156 (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
627(6): 2021/07/04(日)10:11 ID:dMFRzHLQ(1/6) AAS
>>623
外部リンク:wandbox.org
そんなことないよな? と思いつつやってみた
まあ、そんなことないよな
ただ実験してて一個だけ気になったのが
take_S(S());
ってやった場合、default→moveじゃなくて単にmoveとしか表示されなかった
C++11/14でも-fno-elide-constructorsを付けない限りmoveだけ
これってなんで?
629(1): 2021/07/04(日)11:45 ID:WJcubPcO(2/13) AAS
>>627
解説キボティーヌ
"copy"と表示されているわけだが
631(1): 2021/07/04(日)12:12 ID:WJcubPcO(4/13) AAS
>最適化されて bar(func()) になるときだけオブジェクトの構築が省略されるって言いたいの?
微妙にちげう func()がオブジェクトをコピー返しする関数である以上、その場合だけムーブにする余地があると言ってゐる
実際は
auto hoge = func()
bar(hoge)
(この後hogeを使う人は居ない)
と分けて書いたら"move"になりそうなケースなのに"copy"になったらしいが(>>627のリンク先
>アホか全然レイヤの違う話だよ
ムーブにできるのは参照の付け替えとみなせるケースなので上の話(コピーをムーブと読み替え得る条件)が別レイヤの話とは認められない
634(1): 2021/07/04(日)12:54 ID:WJcubPcO(5/13) AAS
>>632
"move"にならずに"copy"になったのは謎だと>>631に書いてある
とわいえ、>>623の主張を整理すると、
(1) func()が定義上オブジェクトをコピー返しする関数である場合、auto hoge = func() がムーブになるとは限らず、場合によってはコピーが起きる
(2) ただし、bar(func()) というケースでは、func()の戻り値をbar()に渡す際に、コピーではなくムーブが選択される余地がある
というものであって、bar(func())に類似のケース(>>627のリンク先)でムーブにならずコピーになったからといって>>623が否定されたことにはならない
(∵ムーブが選択される「余地がある」と言っただけであってムーブにする義務があると言ったわけではない
653(3): 2021/07/04(日)20:21 ID:WJcubPcO(13/13) AAS
第2の隠れた引数でcallerがcalleeに構築すべき変数のアドレスを渡しているのだとすると
>>627のコードが"default"の次に"copy"になるのはある程度説明がつく
1. return_S()関数でS構築 --- ここでS:S()が呼ばれ、"default"表示
2. auto hoge = return_S()では何も起きない(∵1で&hogeにSが構築済み)
3. take_S(hoge)で呼び出しの引数としてhogeをコピー
--- &hogeにあるSが、スタックの上の方に引数としてコピーされる結果"copy"表示
しかしhogeはその後使っていないのだから、コンパイラ的には3はmoveになる余地があるはず
なお>>641までの漏れのレスは第2の隠れた引数は仮定せず、return_S()(callee)がスタックのトップに
return valueとしてS()を構築して、
それが呼び出し元(caller)が&hogeにcopy(ムーブコンがあればmove)する穏当なモデルを考えていた
省2
686: 2021/07/11(日)02:58 ID:YJk6tGcw(9/11) AAS
んまーとは言ったものの、
【実験1】 >>627のコードをループにしてやって最適化「-O2」にしても"move"にならなんだorz
外部リンク:wandbox.org
結果:
default
--------
copy
0, 1
default
--------
省4
688(1): 2021/07/11(日)03:09 ID:YJk6tGcw(11/11) AAS
(言い訳1)
実験3のような最適化が許されるのだから、copyをmoveに読み替える最適化も許されるべきだ
規格に照らしてどうなのかはC++規格の専門家の反応待ち
(言い訳2)
今回のケースでGCC様がcopyをmoveにする最適化を拒むのは、単にhogeの使用箇所の分析をサボっているか
(データフロー解析の一環として論理的には十分take_S()呼び出し後の未使用を機械的判定をやれるはずなのに…
、デストラクタのdefault[] のコストでも気にしている可能性が微レ存
(言い訳3)
>>627のコードでmoveになる、と最初に言い出したのは>>609であって漏れではない
むしろ漏れは「場合によってはcopyが起きる」(>>623)と述べてたのでcopy派である
省1
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.041s