IMO あなたが達成しようとしていることは完全には明らかではありません。動的割り当てを使用する場合、関数は単純に次のようにする必要があります。
BigObj * fun()
{
return new BigObj;
}
int main()
{
BigObj *pb = fun();
}
...そして、面倒を省きます。
回答の以前のリビジョンとは対照的に、完全に分析できる静的コンテキストにある限り、コンパイラーはかなりの量の作業を省略できることが判明しました。
class C {
public:
C() {qDebug() << "C created";}
C(const C & o) { qDebug() << "C copied"; }
};
C foo() {
C c;
qDebug() << &c;
return c;
}
...
C c = C(foo()); // note that `C c = ` is also copy construction
qDebug() << &c;
出力は、両方のインスタンスが同じアドレスを持っていることを確認するため、ローカルのコンテキストであっても、インスタンスは実際には のスタック フレームに格納されませんfoo
。
変更:
C * cp = new C(foo());
qDebug() << cp;
驚いたことに、値コピーによる戻り値コピーとコピー コンストラクターの両方を省略して、同じアドレスも出力しました。c
infoo
は、によって割り当てられたメモリ チャンクに直接構築されnew
ます。
結論として、C++ コンパイラは、考えられるあらゆる最適化の分析と実行において非常に優れています。
最初と 2 番目のケースでそれぞれ最適化をオフにします。
C created
0x28fd97
C copied
C copied
C copied
0x28fdeb
...
C created
0x28fd97
C copied
C copied
0x34fd00