最後に C++ で何かをしたのは何年も前のことです。最近、誰かが C++ の学校のプロジェクトで私に助けを求めてきました。私が見た言語の「機能」に興味をそそられました。
私が覚えているように、クラスのインスタンスをヒープまたはスタックのいずれかに作成できます。
int main() {
MyClass *inHeap = new MyClass();
MyClass inStack = MyClass();
}
私が知る限り、最初の変数,は、オブジェクトの実際のインスタンスを指すポインター (4 バイト? 8 バイト? そのようなもの) を保持するのに十分な量inHeap
のスタックをコンパイラーにスタック フレームに予約させます。main
ヒープに住んでいます。
また、2 番目の変数は、スタック フレーム内にinStack
の完全なインスタンスを保持するのに十分な量のスタックをコンパイラに予約させます。MyClass
main
では、私の質問に移ります。のインスタンスを返す関数があるとしますMyClass
。最初は、ヒープ内のインスタンスしか返せないと思っていました。
MyClass *createInHeap() {
return new MyClass();
}
int main() {
MyClass* inHeap = createInHeap();
}
しかし、私が見たのは次のとおりです。
MyClass createInStack() {
MyClass c = MyClass();
return c;
}
int main() {
MyClass inStack = createInStack();
}
ここで何が起こっているのですか?
のインスタンスのメモリは
MyClass
のスタック フレームに予約されていますcreateInStack
か? この場合、このコードは、関数が戻るときにインスタンスをスタック フレームに強制的にコピーしますか? このコピーはどのように実行されますか、つまり、関数内でコピー コンストラクターが自動的に呼び出されるだけですか?main
createInStack
main
私が考えたもう 1 つの可能性は、コンパイラが十分にスマートで、スタック フレーム
MyClass
内のインスタンス用のメモリを既に予約しているということです。main
これは存在しますか?これは、おそらく高価なコピーを作成することを避けるためのある種の最適化ですか?
最後の質問として、スタックにインスタンスを作成した場合、そのデストラクタは正確にいつ呼び出されますか? それが作成されたスコープが終了するのはいつですか?