Sizeof空类

时间:2011-08-01 14:28:22

标签: c++

使用代码:

#include <iostream>

class A {};
class B { char x; };

int main()
{
    std::cerr << sizeof(A) << " " << sizeof(B) << std::endl;
}

我知道要问一个空课的大小是一个常见的面试问题 - 我知道答案是一个。

我的问题是......在一个空类的“1”字节中保存了什么(我猜它是空的),编译器在内部做了什么来使它成为sizeof B在这种情况下与sizeof A相同吗?

我想完全理解它,而不仅仅是知道答案。

3 个答案:

答案 0 :(得分:8)

这不是一个有意义的问题:运行时只是将一个字节标记为已占用,因此不会在其位置分配其他对象。但是没有任何“持有”来占据该字节。

此规则的唯一原因是对象必须是唯一可识别的。对象由其在内存中的地址标识。为了确保没有两个对象具有相同的地址(基类对象除外),空类对象通过具有非零大小来“占用”内存。

答案 1 :(得分:4)

C ++标准中没有要求空对象应占用一个字节的内存。它纯粹基于实现。

编辑: 是的,它符合(ISO / IEC 14882第149页):

9个班级[班级]
..
..
..
3类类型的完整对象和成员子对象应具有非零大小...

答案 2 :(得分:0)

您经常可以在类似的类中看到类似的效果:

class Foo {
  int a;
  char b;
}; // sizeof(Foo) > sizeof(int) + sizeof(char)

并非C ++对象中的所有内存都需要具有名称。在对象内部取消命名内存是通用的称为“填充”。您的空类恰好有一个填充字节。 C ++编译器插入填充的最常见原因之一是允许在数组类型中使用类。