7

前の質問では、単純な値による戻り関数は常にそのreturn引数を割り当てられている変数にコピーするように見えました。

これは標準で要求されていますか、それとも関数本体内でも「割り当てられた」変数を作成することで関数を最適化できますか?

struct C { int i; double d; };

C f( int i, int d ) {
    return C(i,d); // construct _and_ copy-construct?
}

int main() {
    C c = f( 1, 2 ); 
}
4

4 に答える 4

8

この規格では、ここで任意のレベルのコピーの省略が許可されています。

  • ローカル一時を構築し、それを戻り値にコピー構築し、戻り値をローカル「c」にコピー構築します。また
  • ローカル一時を構築し、それを「c」にコピー構築します。また
  • 引数「i、d」を使用して「c」を作成します
于 2009-03-20T12:02:50.753 に答える
7

標準では、コピーコンストラクタを使用する必要はないとされています。セクション12.8/15を参照してください。

15コピーコンストラクタを使用して一時クラスオブジェクトがコピーされ、このオブジェクトとコピーが同じcv-unqualifiedタイプである場合は常に、実装は元のオブジェクトとコピーを同じオブジェクトを参照する2つの異なる方法として扱うことができます。クラスコピーコンストラクタまたはデストラクタに副作用がある場合でも、コピーを実行します。

そして、同様の流れではるかに。

于 2009-03-20T12:02:46.853 に答える
0

パラメータを参照渡しして結果を代入しない方法はありますか?

于 2009-03-20T12:40:45.767 に答える
-1

このような考慮事項を完全に回避するための非常にシンプルで優れた方法が1つあります-作成されたオブジェクトにboost::shared_ptrを返すことを検討できます-使いやすさに関しては実質的に同じですが、オブジェクトが不必要にコピーされることはありません-そしてそれは数層の関数呼び出しを介してそれを返す場合にも当てはまります。

于 2009-03-20T12:04:07.927 に答える