4

POD の種類と、それらがスタック上でどのように割り当てられ、初期化されるかを理解しようとしています。与えられた

class A {
public:
  A();
  int x;
};

class B {
public:
    int x;
};

int func()
{
    A a;
    B b;
}

b は a の後に割り当てられますが、a の前に初期化されるというのは正しいですか? つまり、スペースは宣言された順序で a と b に割り当てられますが、スペースが割り当てられると b が初期化され、宣言されると a が初期化されますか?

POD と Aggregated に関する非常に優れた FAQ を読みました。Aggregate と POD とは何ですか。

彼が言ったことの 1 つ: 非 POD クラス型のオブジェクトの有効期間は、コンストラクターが終了したときに始まり、デストラクタが終了したときに終了します。POD クラスの場合、有効期間はオブジェクトのストレージが占有されたときに始まり、そのストレージが解放または再利用されたときに終了します。

そのため、POD がどのように割り当てられ、初期化されるか、およびそれが非 POD とどのように異なるかの詳細を理解しようとしています。

4

3 に答える 3

9

No.aの割り当てと初期化が最初に行われ、次にb割り当てと初期化が行われます。C++ プログラムは、ステートメントごとに実行されます。メモリは自動であるため、とにかく明示的な割り当ては行われません。すべて自動的に処理されます。

(たとえば、デスクトップ オペレーティング システムで使用される典型的な呼び出しスタックの実装では、メモリは常にそこにあり、割り当てられる必要はまったくなく、アドレス指定されるだけです。)

于 2013-06-18T16:31:25.440 に答える
2

A と B が割り当てられるメモリ内の順序について、いかなる種類の保証もありません。

A と B の両方にコンストラクターがある場合、a は b の前に呼び出されます。しかし、あなたが尋ねているPODタイプ(およびBがどれであるか)は、この構文ではまったく初期化されていないため、問題は意味がありません。

ストレージがいつ割り当てられるかに関連するオブジェクトの初期化の問題は、とにかくあまり意味がありません。たとえば、ここでのほとんどのコンパイラは、1 回のスタック ポインタの移動で A と B にスペースを割り当てます。準拠している C++ プログラムがそのようなことを検出できる方法がないことを考えると (それは何を意味するのでしょうか?)、コンパイラはほとんど何でも実行できます。

于 2013-06-18T16:31:45.757 に答える
0

これらはローカル変数であり、常識的には「割り当て」られていません。そこにあると考えることができます。(方法は実装に任せます。一般的な方法は、プロセッサがサポートするスタックを使用することです。その場合、すべてのローカル オブジェクトのすべてのストレージは、関数のエントリでスタックに取り込まれます)。

初期化は常に宣言の順序で行われます。ここでは、A::A() が a に対して呼び出され、次に B::B() が b に対して呼び出されることを意味します。

于 2013-06-18T16:42:46.150 に答える