我正在设计一个小型系统,并且想知道如何为派生类分配内存的细微差别。
如果我有两个班级
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构造函数时分配。
提前感谢您的帮助。
答案 0 :(得分:2)
sizeof(bar)足够大,可以包含sizeof(foo),并且所有内容都会在分配请求中分配。
答案 1 :(得分:2)
new Bar
只是一个连续的分配,new Bar[n]
也是如此。
这可能有点像这样想:
Bar* purple = new Bar();
与类似:
Bar* purple = (Bar*)malloc(sizeof(Bar));
在幕后,也会调用构造函数,在某些情况下,分配可能大于sizeof(Bar)
; new[]
是一个常见的情况,它更大,因为在许多实现中,数组的计数被秘密存储在分配中。
<强>更新强>
sizeof Bar
本身是存储类型所需的大小;它的成员,它的基础,指向它的vtable的指针等 - 都具有原生对齐(默认情况下)。编译器也可能引入填充。
因此,单个连续分配将足够大,以容纳foo和bar所需的所有内容,包括foo::a
和bar::b
。