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

Move in C++ without a std:move

C++23で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は不要になります。
  1. sprocketz

    NVRO(名前付き戻り値の最適化)を実装するのがそんなに難しい理由は何なんでしょう?なぜRVOと同じように義務化できなかったのでしょうか?コンパイラは文字通り、直接構築の単純なreturn文を特別扱いしているだけなのでしょうか?

  2. fluoridation

    残念ながら、正しい、あるいは高性能な振る舞いを得るには、値のセマンティクスを理解することから逃れる道はないと思います。

  3. tom_

    著者が読んでいるなら:複雑な例はどちらも同じです。

この日のほかの記事

2026-09-02