4

我々はすべてそれを知っている

Foo returnAFoo()
{
    return Foo();
}

Foo戻り値の最適化を使用してコンパイルされるため、コピー コンストラクターに副作用があっても値のコピーは取得されません。しかし、

Foo returnAFoo()
{
    Foo f = Foo();
    return f;
}

それも?2 番目の構文は、デバッグ時に役立ちます。しかし、そうすることで重要な最適化を捨てているのでしょうか? おそらく、明示的な移動コンストラクターを作成する必要がありますか?

4

1 に答える 1

7

いいえ。コピー省略はここでも適用できます。この特定のケースでは、NRVO (名前付き戻り値の最適化) と呼ばれます。コピー省略を実行するためにムーブ コンストラクターは必要ありません。コピー省略は、コピー コンストラクターしかなかった C++98/03 から標準に含まれています。

コピー省略が使用される可能性を最大限にするには、すべてのコード パスが同じオブジェクトを返す (NRVO) か、すべてのコード パスが一時オブジェクトを返す (RVO) ことを確認する必要があります。

同じ関数内で NRVO と RVO を混在させると、最適化を適用するのが難しくなります。


NRVO を示すサンプル コード。

于 2016-03-23T08:48:24.817 に答える