3

値によって巨大なオブジェクトを返す関数を作成しました。私の同僚は、冗長なコピーを行い、関数の引数として参照によってオブジェクトを返すことを提案すると不満を漏らしています。戻り値の最適化が行われ、コピーが削除されることはわかっていますが、コードはさまざまなコンパイラでコンパイルできるライブラリで使用されるため、それらすべてをテストすることはできません。値によってオブジェクトを返すことが保存されていることを同僚に納得させるために、それが述べられているドキュメントが必要です。

私は c++03 標準を見てきましたが、戻り値の最適化については何も見つかりません。RVOが行われることが定義されているドキュメント(標準)へのリンクを教えてください。または、RVO をサポートするコンパイラのリストを見つけることができる場所が存在しない場合は?

4

2 に答える 2

2

標準は、RVO が発生することを保証するものではなく、許可するだけです。

生成された実際のコードをチェックして、それが発生したかどうかを確認できますが、今後も発生するという保証はありません。

しかし、最終的には、適切なコンパイラはすべて多くの場合 RVO を実行できます。また、RVO が発生しない場合でも、C++11 (およびそれ以降) のムーブ コンストラクションを使用すると、戻り値が比較的安価になります。

于 2015-05-06T16:08:05.863 に答える
2

RVO が完了していることを同僚に証明するために使用できる方法の 1 つは、printfs などのステートメントをコードに入れることです。

HugeObject& HugeObject::operator=(const HugeObject& rhs)
{
  printf("HugeObject::operator= called\n");
}

HugeObject::HugeObject(const HugeObject& rhs)
{
  printf("HugeObject::copy constructor called\n");
}

HugeObject SomeFunctionThatCreatesHugeObject()
{
  ...
  printf("SomeFunction returning HugeObject\n"
}

次に、問題のコードを実行し、予想される数のオブジェクトが構築/コピーされていることを確認します。

于 2015-05-06T17:18:14.787 に答える