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