gpt4 book ai didi

c++ - 为什么 sizeof(BaseClass) == sizeof(DerivedClass) 虽然我添加了一个成员

转载 作者:IT老高 更新时间:2023-10-28 12:29:08 25 4
gpt4 key购买 nike

从下面的代码 sizeof(Base) == 24sizeof(Derived) == 24

为什么它们的大小相等?

Base 类中我们有 3 个成员,在 Derived 类中我们有另一个成员。

class Base
{
private:
double d;
protected:
long l;
public:
int i;
};

class Derived : public Base
{
private:
float f;
};

最佳答案

碰巧你的类(class)Base有 8 字节对齐要求,但其最后一个成员的大小为 4。这导致在 Base 末尾添加一个空填充区域的内存布局。当您实例化类 Base 的对象时,额外的填充会发挥作用。本身,即所谓的最衍生对象

Base b; // <- a most-derived object
Base a[10]; // <- an array of most-derived objects

但是,当您“嵌入”Base作为类Derived的基类, 嵌入的 Base 的末尾不需要额外的填充子对象。

Derived d; // <- object `d` contains an embedded sub-object of type `Base`

智能编译器会尝试通过放置类 Derived 的额外字段来重用该区域。进入 Base 中用于填充的布局区域.在您的情况下,额外字段 Derived::f顺便说一句,它具有相同的 4 个字节大小,即它完全适合那里。最终结果是类的总大小没有增加。

一个非常相似(本质上)的效果就是所谓的“空基优化”。在 C++ 中 sizeof对于任何类型都保证大于 0,这意味着 sizeof空类的值总是大于零。但是,当您从空基类派生其他类时,您可能会观察到基类对派生类的大小的贡献正好为 0 字节。例如

struct A {};
struct B {};
struct C {};
struct D {};

struct F : A, B, C, D {
int i;
}

int main() {
std::cout << sizeof(A) << std::endl << sizeof(B) << std::endl <<
sizeof(C) << std::endl << sizeof(D) << std::endl;
std::cout << sizeof(F) << std::endl;
}

即使 sizeof每个基类的大于零,sizeof(F)通常仍会评估为 sizeof(int) ,就好像基类子对象根本不存在一样。

换句话说,正如这些示例所示,基类子对象在内存布局方面比大多数派生对象遵循明显更宽松的规则。这些宽松的规则可能很容易导致sizeof的基类只会部分贡献sizeof派生类。

关于c++ - 为什么 sizeof(BaseClass) == sizeof(DerivedClass) 虽然我添加了一个成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21220774/

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