4

コピー コンストラクターとムーブ コンストラクター、および関数を含むオブジェクト 'foo' があるとします。

foo f() {
    foo bar;
    /* do some work */
    return bar;
}

標準では、コンパイラが次のことを試みると述べているようです。NRVO、右辺値参照による戻り、値による戻り、失敗。その順序で。

私のコピーコンストラクターは非常に高価なので、コンパイラーが値を返さないようにする方法はありますか?

4

3 に答える 3

9

コンパイラは次のことを試みます: NRVO、右辺値参照による戻り、値による戻り、失敗; その順序で。

上記の文言は不正確であり、あなたの誤解を示している可能性があります。コンパイラはNRVO を使用できます (ほとんどの場合)。それが使用できない場合は、常に値によって返されます。違いは、返された値がどのように構築されるかです。型に移動コンストラクターがある場合、コンパイラはそのコンストラクターを使用する必要があり、型に移動コンストラクターがない場合にのみコピー コンストラクターを使用するようになります。

つまり、型に移動コンストラクターがある場合、コピー コンストラクターを使用するコンパイラは C++11 に準拠していません。

于 2012-11-26T02:34:52.093 に答える
2

foo移動コンストラクターが機能している場合、コードはコピーによって返されることはありません。

于 2012-11-26T01:34:56.783 に答える
0

返す代わりに out-parameter を使用することもできます。

void f(foo& bar) { ... }

しかし実際には、すべてのコンパイラがNVROを実行します。

于 2012-11-26T01:14:30.977 に答える