为何子类添加成员变量后与基类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.
相关产品推荐
相关产品推荐

