私自身の好奇心のための質問です。メソッドを作成するときは、コピー/破棄パラダイムを使用するのが最善であると何度も聞いています。したがって、次のような方法がある場合:
OtherClass MyClass::getObject(){
OtherClass returnedObject;
return returnedObject;
}
おそらくコンパイラは、基本的にメソッドをインライン化し、を呼び出すメソッドのスタック上にクラスを生成することによって、これを最適化しますgetObject
。このようなループでそれがどのように機能するのだろうかと思います
for(int i=0; i<10; i++){
list.push_back(myClass.getObject());
}
コンパイラOtherClass
はスタックに10個のインスタンスを配置して、このメソッドをインライン化し、最適化されていないコードで発生するコピーと破棄を回避できるようにしますか?このようなコードはどうですか?
while(!isDone){
list.push_back(myClass.getObject());
//other logic which decides rather or not to set isDone
}
この場合、コンパイラは何回getObject
呼び出されるかを知ることができなかったので、スタックに何かを事前に割り当てることができると考えられます。したがって、インライン化は行われず、メソッドが呼び出されるたびに、コピーOtherObject
?
私は、すべてのコンパイラーが異なっていること、そしてこれはむしろコンパイラーがこのコードが最適であると信じていることに依存していることを理解しています。私は一般的な言葉で話しているだけですが、ほとんどのコンパイルはどのように応答する可能性が最も高いでしょうか?この種の最適化がどのように行われるのか興味があります。