gpt4 book ai didi

c++ - 派生 C++ 类的内存分配

转载 作者:行者123 更新时间:2023-11-30 02:07:27 28 4
gpt4 key购买 nike

我正在设计一个小型系统,想知道如何为派生类分配内存的细微差别。

如果我有两个类(class)

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 构造函数时分配。

在此先感谢您的帮助。

最佳答案

new Bar 只是一个连续分配,new Bar[n] 也是如此。

这样想可能会有所帮助:

Bar* purple = new Bar();

类似于:

Bar* purple = (Bar*)malloc(sizeof(Bar));

在幕后,构造函数也被调用,在某些情况下分配可能大于sizeof(Bar)new[] 是一个常见的情况,它更大,因为在许多实现中数组的计数 secret 存储在分配中。

更新

Bar 的 sizeof 本身就是存储类型所需的大小;它的成员、它的基、指向它的 vtable 的指针等 - 都具有 native 对齐(默认情况下)。编译器也可能引入填充。

因此,单个连续分配将足够大,足以容纳 foo 和 bar 所需的所有内容,包括 foo::abar::b

更详细:where are member-vars of a class on the heap stored?

关于c++ - 派生 C++ 类的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7828145/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com