以下のコードを検討してください。
// Consider that MyObject receives three integers in it's constructor.
MyObject createObject()
{
MyObject result(1, 2, 3);
return result;
}
私の知る限り、(この関数のように) C++ でオブジェクトを返すと、コンパイラはクライアントのスタックに新しいオブジェクトを (ローカル変数として) 作成します。この例では、パラメーターとしてMyObject
コピー コンストラクターを使用して作成される新しいオブジェクトになりresult
ます。これは、マシンの冗長処理を意味します。オブジェクトresult
がスタックに作成され、次に 2 番目のオブジェクトが作成されて返されます。これを回避する別の方法は、オブジェクトを動的に (スタックではなく) 作成し、そのポインターを返すことです。ただし、メモリ リークが発生したり、クライアントが使用後にオブジェクトを強制的に削除したりする可能性があります。したがって、私が見つけた解決策は、次のようにスマート ポインターを使用することでした。
// Consider that MyObject receives three integers in it's constructor.
boost::smart_ptr<MyObject> createObject()
{
boost::smart_ptr<MyObject> result(new MyObject(1, 2, 3));
return result;
}
これは機能しますが、スマート ポインターは依然として再作成されるオブジェクトです (基本的にはポインターのみを保持するため、コストが低くても)。これをもっと簡単に行う方法があるかどうかを推測していました。または、この作業などを最適化する方法がコンパイラーによってまだ実装されていない場合。私がやりたいことをするためにコンパイラに言う構文はありますか?