記述したコードの正確性は、最適化に依存することはありません。仕様で使用しているC ++「仮想マシン」で実行すると、正しい結果が出力されます。
ただし、あなたが話しているのは、より効率的な質問です。RVO最適化コンパイラで最適化すると、コードの実行が向上します。他の回答で指摘されたすべての理由から、それは問題ありません。
ただし、この最適化が必要な場合(コピーコンストラクターによって実際にコードが失敗する場合など)、コンパイラーの気まぐれになります。
私自身の実践におけるこれの最良の例は、テールコールの最適化だと思います。
int sillyAdd(int a, int b)
{
if (b == 0)
return a;
return sillyAdd(a + 1, b - 1);
}
馬鹿げた例ですが、関数の最後に関数が再帰的に呼び出される末尾呼び出しを示しています。C ++仮想マシンは、このコードが適切に動作することを示しますが、そもそもなぜこのような追加ルーチンを作成するのが面倒なのか、少し混乱するかもしれません。ただし、C ++の実際の実装では、スタックがあり、スペースが限られています。慎重に行われた場合、この関数はb + 1
追加時に少なくともスタックフレームをスタックにプッシュする必要があります。計算したい場合sillyAdd(5, 7)
、これは大したことではありません。を計算したい場合sillyAdd(0, 1000000000)
、StackOverflowを引き起こすという本当の問題が発生する可能性があります(良い種類ではない)。
ただし、その最後の戻り行に到達すると、現在のスタックフレーム内のすべての処理が完了したことがわかります。実際に保持する必要はありません。テールコールの最適化により、既存のスタックフレームを次の機能に「再利用」できます。このようにして、必要なスタックフレームは1つだけでなく1つですb+1
。(これらの愚かな加算と減算をすべて行う必要がありますが、それらはより多くのスペースを必要としません。)実際、最適化によりコードは次のようになります。
int sillyAdd(int a, int b)
{
begin:
if (b == 0)
return a;
// return sillyAdd(a + 1, b - 1);
a = a + 1;
b = b - 1;
goto begin;
}
一部の言語では、テールコールの最適化が仕様で明示的に要求されています。C ++はそれらの1つではありません。ケースバイケースで進めない限り、C ++コンパイラに頼ってこのテールコール最適化の機会を認識することはできません。私のバージョンのVisual Studioでは、リリースバージョンはテールコールの最適化を行いますが、デバッグバージョンは(設計上)行いません。
したがって、私が計算できることに依存するのは悪いでしょうsillyAdd(0, 1000000000)
。