【问题标题】:Size of a class in C++ [duplicate]C ++中类的大小[重复]
【发布时间】:2013-10-01 03:07:25
【问题描述】:

我正在测试 C++ 中基类和派生类的大小。

class X {}; 
class Y : public virtual X {}; 
class Z : public virtual X {}; 
class A : public Y, public Z {};

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

【问题讨论】:

  • 这称为未指定行为:实现可以为所欲为,使程序正常工作,并且不需要记录甚至可靠的行为。

标签: c++


【解决方案1】:

这取决于编译器中的实现。比如说,我在 GCC 上得到了 1、8、8、16。

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

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

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

【讨论】:

  • 这不是“为空类主体加 1 个字节”,而是“加 0 个字节,四舍五入到 4 的第一个非零倍数”。
  • 派生类的大小应不小于基类的大小。这个想法是,在 Y 类中,我们有 4 个字节的 vtable + 1 个字节用于 X 类的空主体(不是 Y 的空主体)。然后对齐5个字节,得到8个字节。同样,这也取决于我们是编译为 32 位还是 64 位。
  • 也许这不是你的意思,但一个空的类体不是 1 个字节。它是零字节。唯一的问题是,一旦知道了对象的整个类型,该对象至少需要一个字节大,所以如果它是零字节,则添加一个字节。但是空类本身不会贡献任何字节。
  • vtable 在整个答案中应阅读vtable pointervtable 不是类实例或其大小的一部分,但 vtable 指针是。
  • Mehrdad,一个空类,当从其派生时,理论上可以将其一个字节贡献给派生类。由编译器来优化它。此外,作为概念的“空类主体”根本没有字节和大小。但是是的,它在编译时会得到一定的大小,保证至少有 1 个字节长。
猜你喜欢
  • 2012-03-21
  • 2018-05-12
  • 2010-12-22
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多