デストラクタをC ++で理解する

私たち全員が知っているように、関数が返ってくると、スタックに割り当てられたオブジェクトが再利用され、関連するデストラクタがその前に呼び出されます。私の質問は:どのように私たちがデストラクタを呼び出すことができるようにオブジェクトを表すためにメモリの場所が決定されるのですか?これを実行するために実行時のオーバーヘッドが発生していますか?

0
@DavidSchwartzそれはまさに私が求めていることです。
追加された 著者 dacongy,
どのスタックオブジェクトを破壊する必要があるか、スタックオブジェクトの場所を実装がどのように知っているか尋ねていますか?
追加された 著者 David Schwartz,
メモリの場所は実装の詳細です。なぜあなたは心配していますか?また、どのランタイムを使用していますか?仮想マシンやネイティブ命令セットで実行していますか?
追加された 著者 mda,

3 答え

スタックに割り当てられたオブジェクトの位置は、現在のスタックポインタの位置に対するオフセットとして計算されるため、実際には計算は必要ありません。

動的メモリマネージャがオブジェクトをどこに割り当てるかを決定しなければならないヒープ割り当てオブジェクトとは異なり、スタックは単なる線形であり、必要に応じて増加し、コンパイラはオブジェクトが現在のポインタ指定されたバイト数を少なくし、その変数が必要なときはいつでもバイナリコード全体でその値を使用します。

2
追加された

私はあなたが尋ねていることを正確にはわかりませんが、スタックに割り当てられたオブジェクトのメモリ位置はコンパイル時にわかります。その場所を特定するためのランタイムオーバーヘッドはありません。

2
追加された
それは正しいですか?これらのオブジェクトへのポインタはコンパイル時に認識され、デストラクタへの呼び出しは関数のポストログにコンパイラによって挿入されます。
追加された 著者 dacongy,
まあ、実際には...ありがとう答えのためにたくさん!
追加された 著者 dacongy,
はい、今あなたは宿題に取り組んでいると思っています...
追加された 著者 Ned Batchelder,

デストラクタを呼び出すことができるように、オブジェクトを表すメモリ位置はどのように決定されますか?

メモリロケーションは、コンストラクタがいつ呼び出されるかを決定しません。コンパイラは、どの変数がスタックに割り当てられているかを知り、対応するデストラクタを呼び出すための適切なコードを作成します。

少なくとも、彼らは通常スタックにあります。ポイントは、メモリがどこに格納されていたかにかかわらず、同じロジックを使用できるということです。スタックに格納されているということは、一方的に呼び出される必要があることを意味します。

1
追加された