C++中什么决定了一个类的对象的大小

在C++中有很多因素决定了累对象的大小,这些因素如下:

  1. 所有非静态成员变量
  2. 成员变量的顺序
  3. 字节对齐方式
  4. 直接基类的大小
  5. 虚函数
  6. 用的什么编译器
  7. 继承模式(虚继承)

所有非静态成员变量的大小

A 类对象大小为sizeof(Mem1)+sizeof(Mem2)+sizeof(Mem4),静态成员变量Mem3并不是一个类对象的一部分。

成员变量的顺序

这个类sizeof(C), 为24字节。即使c只用一个字节,但是为了对齐在其后补了3个字节。这是因为它下一个成员是占用4字节的int,如果不填充3字节,对这个整数的访问将是2个读取周期。所以编译器自动补齐。

如果我们把上面代码改一下顺序,如下:

现在大小为20字节

如果我们指定字符对齐方式为不对齐,那么上面两个类大小为19。

直接基类的大小

sizeof(D) 为 12,包含 B。

虚函数

虚函数会在在类中增加4字节的虚函数表指针。看如下示例代码:

sizeof(Base)为8字节:sizeof(iAMem) + sizeof(vptr)。sizeof(Derived) 为12字节:sizeof(iBMem)+sizeof(Base)。注意在Derived中的虚函数不会占用任何空间,Derived会设置vptr为自己的虚函数表。

编译器相关

在Microsoft C++ 编译器中 DerivedClass 大小为16字节,在 GCC 中为12字节。

继承方式(虚继承)

如下代码:

大小为:

  • ABase 大小 : 4
  • BBase 大小 : 12
  • CBase 大小 : 12
  • ABCDerived 大小 : 24

因为BBase 和 CBase 虚继承自 ABase,他们也有虚函数表指针。BBase 和 CBase:sizeof(Base) + sizeof(IMem) + sizeof(vptr)。

ABCDerived 是 24 不是28,是因为它只需要维护一个虚函数表。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注