C++23でstd::move不要に:戻り値の暗黙ムーブがもたらすパフォーマンス向上
Move in C++ without a std:move

C++のムーブセマンティクスを巡る議論で、Andreas Fertig氏は「std::moveは滅多に使うべきではない」という持論を展開しています。本記事では、コピー省略(RVO/NRVO)と暗黙のムーブに焦点を当て、C++11からC++23にかけて言語仕様がどのように進化し、不要なコピーを回避できるようになったかを解説します。特に、右辺値参照を引数に取り戻り値として返す関数が、C++20まではコピーを強制されたり、C++23では暗黙のムーブが適用されたりする例を挙げ、コンパイラの違い(GCCとClang)による挙動の差異にも言及します。最終的に、C++23ではstd::moveを明示的に使わずとも最適なパフォーマンスが得られるケースが増え、開発者はより簡潔で効率的なコードを書けるようになると結論づけています。
C++23モードに切り替えると、両方のケースで暗黙のムーブが行われ、std::moveは不要になります。
HNでの議論
47- tom_
著者がこれを読んでいるなら:複雑な例は2つとも同じです。
- fluoridation
残念ながら、正しいかつ高性能な振る舞いを得るには、値セマンティクスを理解することから逃れる道はないと思います。
- vivzkestrel
- 愚かな質問ですが、C++の話題なので、learncpp.comを読み終えました。
- どうすれば、これをゼロからPlayStation 3エミュレータを作る人にまで持っていけますか?
- 本当にC++が上手くなるために、難易度の高い順にどんなステップバイステップのプロジェクトや学習体験をお勧めしますか?
- sprocketz
NRVOを実装するのがそんなに難しい理由は何ですか?なぜRVOのように義務化できなかったのでしょうか?
コンパイラは単に直接構築の単純なreturn文を特別扱いしているだけなのでしょうか?
- hn45e7pbij
moveに関しては少し反論します——小規模では私にとっては逆のことが当てはまりました。