2009-07-15 25 views
2

obj、playingCardオブジェクトがネストされたforループ内で作成されるのは、2回目のforループが完了した後、objが毎回スタックから割り当て解除されることを意味するからです。ネストされたループの質問での可変割り当て

と小さい側の質問 コンパイラはループと入れ子になったループを追跡するためにスタックを(再帰と同様に)使用しますか?

 

for(int c = 0;c<nElems;c++) { for(int z = c + 1;z<nElems;z++) { playingCard obj; } }

答えて

5

繰り返しごとに構築され分解されます。

しかし、スタック上では、(少なくともVSとGCCでは)割り当ての概念がよりぼやけています。スタックは、コンパイラによって事前に管理されている連続したメモリブロックであるため、ヒープ割り当て(new/deleteまたはmalloc/free)の方法で割り当てと割り当て解除という概念はありません。コンパイラは必要なメモリをスタック上で使用し、後でポインタをロールバックします。

+0

+1なぜスタックの割り当て/取り消しが難しいのかを話しています。一般的に、スタックポインタの上にあるメモリのどの領域も割り当てられていて、その下にあるメモリは割り当てられていません(これには明らかに例外があります:))。 – Falaina

2

内側ループの繰り返しごとに割り当てられたり、割り当てが解除されたりします。

私はあなたの側の質問ではっきりしていませんが、コンパイラはこのスタックを使用して、レジスタに収められないすべてのローカル変数を追跡します。

+2

通常、スタック上の変数は、繰り返しごとに割り当てられたり、割り当て解除されたりしません(コンパイラはそのような方法で変数の記憶域を実装することはできますが、やや愚かです)。変数は、そのコンストラクタはすべてのループの終わりにあるすべてのループとデストラクタのエントリで呼び出されます。関数が返るまでは、ほとんど割り振り解除されません。 – Falaina

+0

ええ、alloc/deallocによって、私は実際にオブジェクトが構築/破壊されることを意味します(これはOPが "objが割り当て解除される"という意味です)。物理的なメモリそのものは、たぶん正しい場所にとどまります。 –

3

オブジェクトのスコープは、囲み中括弧内にあります[関数かループブレースかにかかわらず]。したがって、スコープが終了するとすぐに、オブジェクトのデストラクタが呼び出され、オブジェクトの割り当てが解除されます。

2番目の質問には、ループを処理してオブジェクトを追跡する独自の戦略を維持することがコンパイラによって異なります。

2

スタック内のオブジェクトは、(ループ内でネストされていても)一度割り当てられたり、割り当てが解除されたりします。
しかし、すべての反復でコンストラクタとデストラクタが呼び出されます。

関連する問題