1

次のコード スニペットを検討してください。

list<someClass>& method();
....
list<someClass> test = method();

これはどのような挙動になりますか?このコードは次のようになります:

  1. method() からの戻り値の最適化によって返された someClass インスタンスへの参照を返し、その参照に対して someClass のコピー コンストラクターを実行しますか?

  2. どういうわけかコピーコンストラクターを呼び出さないようにしますか?

具体的には、非常に大きなリストを返すメソッドがあり、戻り値ごとにコピー コンストラクターを呼び出さないようにしたいと考えています。

編集:ええと、申し訳ありませんが、コードは今コンパイルされます...

4

4 に答える 4

4

このコードはコピーを作成する必要があるため、コピー コンストラクターを呼び出す必要があります。method()関数はオブジェクトへの参照を返し、そのコピーを変数に格納する必要がありますtest

オブジェクトではなく参照を返すため、戻り値の最適化は必要ありません。

リストのコピーを作成したくない場合はtest、参照を作成できます。

list<someClass>& test = method();

ただし、testは元のリストを参照するため、変更は元のリストにtestも行われ、元のリストが破棄されるたびにtest無効になります (つまり、オブジェクトの有効期間に注意する必要があります)。

于 2010-07-10T16:24:04.320 に答える
1

RVOが存在します。ここに当てはまるかどうかはわかりません。とにかく、コピーを最小限に抑える方法の 1 つです。

http://en.wikipedia.org/wiki/Return_value_optimization

于 2010-07-10T16:38:47.763 に答える
0

リストを someClass に代入することはできません (代入演算子またはコピー コンストラクターをオーバーロードし、返されたリストを使用してコンストラクトをコピーしない限り)。そうしないと、これはコンパイルされません。

于 2010-07-10T16:24:38.993 に答える
0

あなたのコードを見ると、リストへの参照を返し、そのコピーを作成することによって、ここで何を達成しようとしているのかを推測するのは困難です。

可能であれば、イテレータをリスト (またはイテレータへの参照) に返すというアイデアを検討してください (リストが関数に対してローカルなものではないことを前提としています)。

于 2010-07-10T16:37:48.843 に答える