使用代码:
#include <iostream>
class A {};
class B { char x; };
int main()
{
std::cerr << sizeof(A) << " " << sizeof(B) << std::endl;
}
我知道要问一个空课的大小是一个常见的面试问题 - 我知道答案是一个。
我的问题是......在一个空类的“1”字节中保存了什么(我猜它是空的),编译器在内部做了什么来使它成为sizeof B
在这种情况下与sizeof A
相同吗?
我想完全理解它,而不仅仅是知道答案。
答案 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 ++编译器插入填充的最常见原因之一是允许在数组类型中使用类。