空类的大小

Sizeof empty class

本文关键字:      更新时间:2023-10-16

加上代码:

#include <iostream>
class A {};
class B { char x; };
int main()
{
    std::cerr << sizeof(A) << " " << sizeof(B) << std::endl;
}

我知道这是一个常见的面试问题,问空班的人数-我知道答案是1。

我的问题是……空类(我猜它是空的)的"1"字节中持有什么,编译器在内部做什么使sizeof Bsizeof A在这种情况下相同?

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

这不是一个真正有意义的问题:运行时只是将一个字节标记为已占用,因此不会在其位置分配其他对象。但是没有任何东西被"保存"来占用这个字节。

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

在c++标准中没有要求空对象必须占用一个字节的内存。它完全基于实现。

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

9 Classes [class]
. .
. .
. .
3类类型的完整对象和成员子对象的大小必须为非零

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

class Foo {
  int a;
  char b;
}; // sizeof(Foo) > sizeof(int) + sizeof(char)
并不是c++对象中的所有内存都需要有一个名称。在对象内取消内存名称通常称为"填充"。你的空类恰好有一个字节的填充。c++编译器插入填充的最常见原因之一是允许在数组类型中使用类。
相关文章:
  • 没有找到相关文章