戻り値の最適化をどのように使用しますか?
最新のコンパイラが最適化を使用することを信頼できる場合はありますか、それとも常に安全な方法で何らかの型のポインターを返すか、パラメーターとして参照を使用する必要がありますか?
戻り値の最適化を行うことができない既知のケースはありますか? 戻り値の最適化は、コンパイラーにとって非常に簡単に実行できるように思えます。
戻り値の最適化をどのように使用しますか?
最新のコンパイラが最適化を使用することを信頼できる場合はありますか、それとも常に安全な方法で何らかの型のポインターを返すか、パラメーターとして参照を使用する必要がありますか?
戻り値の最適化を行うことができない既知のケースはありますか? 戻り値の最適化は、コンパイラーにとって非常に簡単に実行できるように思えます。
コンパイラの最適化が有効になっている場合はいつでも (ほとんどのコンパイラでは、最適化が無効になっている場合でも)、RVO が発生します。NRVO はあまり一般的ではありませんが、ほとんどのコンパイラは、少なくとも最適化が有効になっている場合は、この最適化も実行します。
おっしゃるとおり、最適化はコンパイラにとって非常に簡単に実行できます。これが、コンパイラがほとんどの場合実行する理由です。「作成できない」唯一のケースは、最適化が適用されないケースです。RVO は、名前のない一時を返す場合にのみ適用されます。名前付きローカル変数を返したい場合は、代わりに NRVO が適用されます。コンパイラが実装するのは少し複雑ですが、実行可能であり、最新のコンパイラでは問題ありません。
それが発生する可能性を最大限に高めるために、return ステートメントで直接構築されたオブジェクトを返すことができます [このイディオムの名前を覚えている人はいますか - 私は忘れてしまいました]:
Foo f() {
....
return Foo( ... );
}
しかし、すべての最適化と同様に、コンパイラはいつでも実行しないことを選択できます。そして結局のところ、値を返す必要がある場合、コンパイラを信頼する以外に方法はありません。ポインタと参照はそれをカットしません。