2011-10-19 13 views
1

私は小さなシステムの設計に取り組んでおり、派生クラスのためにメモリがどのように割り当てられているかについてのニュアンスについては不思議です。派生C++クラスのメモリ割り当て

私は2つのクラス

class foo { 
public: int a; 
Foo(): a(0) {}; 
}; 
class bar : public foo { 
public: int b; 
Bar() : Foo() , b(0) {} 
}; 

を持っているし、その後

Bar* purple = new Bar(); 

は、私は両方のコンストラクタは(fooとbarのため)と呼ばれることを知っているが、どのように別の方法ではこのような何かを行う場合メモリを割り当てる。 'a'と 'b'の両方のメモリはBarクラスの一部であるか、Fooコンストラクタが呼び出されたときに 'a'に割り当てられたメモリで、 'b' Barコンストラクタが呼び出されたときに割り当てられます。

ご協力いただきありがとうございます。

+4

すべてのメモリが一度に割り当てられます。 – Chad

+2

コンストラクタの本体にaとbを代入するのではなく、イニシャライザ構文を使用する必要があります。 –

+0

ケイト・グレゴリー:頭がおかげでありがとう、今すぐ修正する @Chad助けてくれてありがとう – Adam

答えて

2

new Barは、ただ1つの連続的な割り当てであり、new Bar[n]です。

Bar* purple = new Bar(); 

はと似て次のとおりです:

それはこのように考えるのに役立つかもしれ

舞台裏
Bar* purple = (Bar*)malloc(sizeof(Bar)); 

、コンストラクタとも呼ばれ、いくつかのケースで配分してもよいですsizeof(Bar)より大きくなります。 new[]は、配列の数が多くの実装での割り当てに密かに格納されているため、より大きい場合が一般的です。

更新

のsizeof Bar自体は、タイプを格納するために必要なサイズです。そのメンバー、その基底、そのvtableへのポインタなどが含まれます。コンパイラは、パディングを導入することもあります。

したがって、単一連続割り当ては、foo::abar::bを含むfooとbar requireの両方を保持するのに十分なほど十分に大きくなります。

詳細:where are member-vars of a class on the heap stored?

+0

'バー'は 'foo'を継承しているので、それはすべてのメンバーと機能'foo'があるので、' sizeof(Bar) 'が十分に大きいことが保証されています。 –

+0

@Mooing Duck出来ました。ありがとう。 – justin

2

sizeof(bar)はsizeof(foo)を含むことができるように十分大きく、一度の割り当て要求ですべてが割り当てられます。