[過去ログ]
C++相談室 part156 (1002レス)
C++相談室 part156 http://mevius.5ch.net/test/read.cgi/tech/1621389313/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
634: デフォルトの名無しさん [sage] 2021/07/04(日) 12:54:00 ID:WJcubPcO >>632 "move"にならずに"copy"になったのは謎だと>>631に書いてある とわいえ、>>623の主張を整理すると、 (1) func()が定義上オブジェクトをコピー返しする関数である場合、auto hoge = func() がムーブになるとは限らず、場合によってはコピーが起きる (2) ただし、bar(func()) というケースでは、func()の戻り値をbar()に渡す際に、コピーではなくムーブが選択される余地がある というものであって、bar(func())に類似のケース(>>627のリンク先)でムーブにならずコピーになったからといって>>623が否定されたことにはならない (∵ムーブが選択される「余地がある」と言っただけであってムーブにする義務があると言ったわけではない http://mevius.5ch.net/test/read.cgi/tech/1621389313/634
635: デフォルトの名無しさん [sage] 2021/07/04(日) 13:00:30 ID:WJcubPcO ここで「func()が定義上オブジェクトをコピー返しする関数である」のに何でコピーが削除されてムーブに成り得るのか? という疑問を抱く向きもあるかもしれないが、 これについては構造体やオブジェクトをコピー返しするような関数func()が実際には return valueの置き場所にデフォルト構築するだけのコードに落ちることがあるのを見たらワカル http://mevius.5ch.net/test/read.cgi/tech/1621389313/635
636: デフォルトの名無しさん [sage] 2021/07/04(日) 13:13:36 ID:dMFRzHLQ >>634 もしかして、コピーの代わりにムーブでオブジェクトが構築されることを「コピー省略」だと思ってる?だとしたら違うよ ていうか実験の部分は自己解決しました C++17で必須になったっていうだけで、それまでも(C++98ですらも)省略されることが許されるというのは明記されていたんですね http://mevius.5ch.net/test/read.cgi/tech/1621389313/636
637: デフォルトの名無しさん [sage] 2021/07/04(日) 13:25:14 ID:bouvqZmG 「コピー返し」ってなんぞ? http://mevius.5ch.net/test/read.cgi/tech/1621389313/637
638: デフォルトの名無しさん [sage] 2021/07/04(日) 13:29:00 ID:WJcubPcO >>636 >もしかして、コピーの代わりにムーブでオブジェクトが構築されることを「コピー省略」だと思ってる?だとしたら違うよ 別に 言っているのは 1. オブジェクトの構築はfunc()内のどこかしらで行われる 2. 1の方法によっては、func()がreturn valueをreturnする際のコピーは省略される(func()がそういうコードになる 3. func()がスタック上に返したreturn valueを呼び出し元が自動変数hogeのエリアにコピーする代わりにbar()の引数エリアにmoveする ことがある(>>601が言うように常にmoveになる、というわけではない と言う簡単な主張 http://mevius.5ch.net/test/read.cgi/tech/1621389313/638
639: デフォルトの名無しさん [sage] 2021/07/04(日) 13:49:07 ID:dMFRzHLQ >>638 じゃあ結局>>623のこの部分は間違いってことでいいの? > コピーが省略され得るのは > auto hoge = func(); > bar(hoge); > みたいな呼び出し元がhogeの用の一時的領域を次の関数呼び出しの引数としてやりくりできる場合だけなんじゃないの http://mevius.5ch.net/test/read.cgi/tech/1621389313/639
640: デフォルトの名無しさん [sage] 2021/07/04(日) 14:05:29 ID:bouvqZmG 意味ワカンネ 1. func が内部でオブジェクトを構築する話 2. func の返り値を変数 hoge に束縛する話 3. func の返り値を後で他の関数に渡す話 全部切り分けて考えろよとしか思えんのだが そして 2 について言えば>>621に尽きるだろとしか思えんのだが http://mevius.5ch.net/test/read.cgi/tech/1621389313/640
641: デフォルトの名無しさん [sage] 2021/07/04(日) 14:15:48 ID:WJcubPcO >>640 いやすまん2は確かに間違いでauto hoge = func()はhogeへのmoveで済む >>639 いやすまん「〜できる場合だけ」という限定は間違いやった ついでに言うとbar(func())でたまたまfunc()がスタック上に作ったreturn valueのアドレスも変えずにそのままbar()に渡せるとき moveが起きるという主張も間違いだったかも……(アドレスも変わらないのなら何の構築も不要 http://mevius.5ch.net/test/read.cgi/tech/1621389313/641
642: デフォルトの名無しさん [sage] 2021/07/04(日) 14:27:18 ID:bouvqZmG 何もかもおかしいよお前 「コピー返し」って結局なんやねん 独特の語法でわけのわからんことを主張するな 「印象」「かもしれない」で物事を主張するな 何がわかってて何がわかってないか知れ 質問と主張をごちゃまぜにするな 本格的に社会に居場所なくなるぞ 「全部取り下げます」とだけ言って去れ で一から勉強しろ http://mevius.5ch.net/test/read.cgi/tech/1621389313/642
643: デフォルトの名無しさん [] 2021/07/04(日) 14:32:24 ID:2p3tbjy0 RPGでアイテムを移動させた時に間違ってコピーされてアイテムが増殖する ムーブしないといけない アイテムは一個だけ http://mevius.5ch.net/test/read.cgi/tech/1621389313/643
644: デフォルトの名無しさん [sage] 2021/07/04(日) 14:37:46 ID:HHbHqtlq >>642 面倒見よくて草 昔はこの板にもアンタみたいな厳しい先輩いっぱい居たのにな 今はニワカと趣味グラマが何周送れかわからんポエム呟きあってるだけだし 昔からいる人らは完全スルーしてるはず http://mevius.5ch.net/test/read.cgi/tech/1621389313/644
645: デフォルトの名無しさん [sage] 2021/07/04(日) 14:52:36 ID:WJcubPcO >>642 Callerが(スタック上に)確保したメモリに対してcalleeが構造体を返すという返し方の意味 これについては統一した用語が無いようなのでむしろ知りたいっすね…… >>643 >>623のコードでSにムーブコンが定義されていなかったら増殖を意図しないケースでも コピコンが呼ばれるのだから>>643はたとえとしてはイマイチ http://mevius.5ch.net/test/read.cgi/tech/1621389313/645
646: はちみつ餃子 ◆8X2XSCHEME [sage] 2021/07/04(日) 15:12:00 ID:7/Zaj2J4 >>645 要件を満たすとき (返却値が prvalue のとき) は変数の場所に直接にオブジェクトが構築される.。 コピーやムーブを省略できるというのはそういう意味で、 特に C++17 以降ではコピー省略が許されるときにはコピーコンストラクタもムーブコンストラクタも存在しなくてもいい。 https://wandbox.org/permlink/FOndP8P7Ecv5v5sB http://mevius.5ch.net/test/read.cgi/tech/1621389313/646
647: デフォルトの名無しさん [sage] 2021/07/04(日) 15:50:43 ID:WJcubPcO >>646のコードをVS2019でビルドしたら >error C2280: 'foo::foo(foo &&)': 削除された関数を参照しようとしています と言われるorz ていうか「prvalueならば必ず変数の場所に直接にオブジェクトが構築される」(例外なくそうなる)のだとしたら これはcallerがcalleeに構築すべき変数のアドレスを渡さねば実現できない芸当だけど ABIにそんな隠れた第n引数を設けることまでC++の規格で決めちゃって委員会、 とそこはかとなく疑問が…… (funcがメンバ変数だった場合、隠れた第1引数でthisを渡すことになっているのにこれにさらに追加? http://mevius.5ch.net/test/read.cgi/tech/1621389313/647
648: デフォルトの名無しさん [sage] 2021/07/04(日) 15:56:31 ID:xLbwwiyt いいからお前はRVOでぐぐって来い 話はそれからだ http://mevius.5ch.net/test/read.cgi/tech/1621389313/648
649: デフォルトの名無しさん [sage] 2021/07/04(日) 16:02:57 ID:WJcubPcO >>648 これか https://blog.kmc.gr.jp/entry/2014/12/20/231430 >まるでメンバ関数における暗黙のthisポインタのように、関数の引数に戻り値を格納する先の変数へのアドレスを渡します。 >そしてそのアドレスの先の上にオブジェクトを構築することで、関数内部での一時オブジェクト >生成を呼び出し元のオブジェクト生成とみなすことができます。 このようにしてRVOは実現されています。 >まるでメンバ関数における暗黙のthisポインタのように、関数の引数に戻り値を格納する先の変数へのアドレスを渡します。 mjk、 http://mevius.5ch.net/test/read.cgi/tech/1621389313/649
650: デフォルトの名無しさん [sage] 2021/07/04(日) 16:18:10 ID:2qJME2iB >>649 RVO は、最適化の一種なので、実現方法は色々。 とにかく、コンパイラが、関数の戻り値から左辺へのコピーやムーブを なるべく減らして、いきなりダイレクトに左辺に書き込むような方法を探し出して コード化する。 それをどやってやるかは、関数呼び出しの ABI 依存。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/650
651: デフォルトの名無しさん [sage] 2021/07/04(日) 16:52:18 ID:VOtERW9V >>647 エラーになるのは、VS2019のデフォルトがC++14だから。 プロジェクトのプロパティ→構成プロパティ→C/C++→言語 の 「C++言語標準」を「ISO C++17標準(/std:c++17)」に変更すれば通る。 http://mevius.5ch.net/test/read.cgi/tech/1621389313/651
652: デフォルトの名無しさん [sage] 2021/07/04(日) 18:28:13 ID:WJcubPcO >>651 確かに「C++言語標準」を「ISO C++17標準(/std:c++17)」に変更したら通った >>651 >(RVOを)どやってやるかは、関数呼び出しの ABI 依存。 そういうものだと今の今まで思っていたが、 C++17で>>646のコード(コピコンもムーブコンも明示的に削除)がビルドが通るようになるということは、 第2の隠れた引数でcallerがcalleeに構築すべき変数のアドレスを渡すことが C++17では義務化されるとしか解釈できないのでは…… http://mevius.5ch.net/test/read.cgi/tech/1621389313/652
653: デフォルトの名無しさん [sage] 2021/07/04(日) 20:21:13 ID:WJcubPcO 第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)する穏当なモデルを考えていた 実際n3337.pdf(古いが)を読む限りRVOのやり方は全く規定されてないからアリのはず…… 何で>>642が怒り狂うのかわからん…… http://mevius.5ch.net/test/read.cgi/tech/1621389313/653
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 349 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.030s