C++中类的大小

use*_*322 5 c++

我正在使用C++中的基类和派生类的大小进行测试.

class X {}; 
class Y : public virtual X {}; 
class Z : public virtual X {}; 
class A : public Y, public Z {};
Run Code Online (Sandbox Code Playgroud)

每个X,Y,Z,A的大小分别为1,8,8,12.我无法理解这一点.我知道空类的默认大小是1.所以我可以理解X的大小是1.我知道Y和Z的大小不会,因为会添加virtual_pointer.但8?我不懂.有人可以解释一下吗?

Kar*_*dur 2

这取决于您的编译器中的实现。假设我在 GCC 上得到了 1, 8, 8, 16。

对于Y类,它可以为虚拟基创建一个vtable X,并为空类体创建1个字节。4字节对齐后,总共8字节。

UPD:这也可能取决于您是针对 32 位架构还是针对 64 位架构进行编译。64 位平台上的 vtable 指针将占用 8 个字节,因此 Y 和 Z 的大小也是如此。

因此,您问题的完整答案取决于编译器和目标平台。

  • 也许这不是你的意思,但空的类体不是 1 个字节。它是零字节。唯一的事情是,一旦知道对象的整个类型,该对象就需要至少一个字节大,因此如果它是零字节,则添加一个字节。但是空类本身不贡献任何字节。 (3认同)
  • 在这个答案中,“vtable”应该读作“vtable”*pointer*。“vtable”不是类实例或其大小的一部分,但“vtable”指针是。 (3认同)