You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何子类添加成员变量后与基类sizeof结果仍相同?

C++继承类大小异常现象的解释

问题场景

子类Child继承自包含虚函数的基类Parent,添加成员变量int b后,sizeof(Parent)和sizeof(Child)输出均为16;注释掉b,Child大小不变;添加两个int变量b和c时,大小变为24。

示例代码

#include <iostream>

class Parent {
    int a = 0;
public:
    virtual void foo() {}
};

class Child : public Parent {
    int b; // this line doesn't affect the output
};

int main() {
    std::cout << sizeof(Parent) << ", " << sizeof(Child);
    return 0;
}
// Output is : 16, 16

原因解析

这是内存对齐机制和**虚函数表指针(vptr)**共同作用的结果,结合64位系统的默认内存规则就能理清:

  • 基类Parent的内存构成:
    64位系统中,虚函数表指针vptr占8字节,成员变量int a占4字节。由于C++要求类的总大小必须是其内部最大基本类型大小的整数倍(这里最大是8字节),编译器会自动填充4字节的空白,最终总大小为8+4+4=16字节。
  • 添加单个int b的子类Child:
    子类继承了基类的vptr和a,加上自己的b,总字节数是8+4+4=16,刚好符合8字节对齐要求,不需要额外填充,所以和基类大小一致。就算注释掉b,子类继承的基类成员本身已经占了16字节(包含基类的填充),因此子类大小还是16。
  • 添加两个int变量的情况:
    此时总成员字节数为8+4+4+4=20,按照8字节对齐规则,需要填充到下一个8的整数倍(24),所以sizeof(Child)变为24。

内容的提问来源于stack exchange,提问作者Mathias L.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:31:04