# sizeof 一个空类大小是多大

面试高频指数:★★☆☆☆

也就是下面这个输出多少:

class Empty {};

int main() {
    Empty e1;
    Empty e2;
    std::cout << "Size of Empty class: " << sizeof(Empty) << std::endl;
}

大多数情况下 sizeof(Empty) = 1

# 原因

这是因为C++标准要求每个对象都必须具有独一无二的内存地址。

为了满足这一要求,编译器会给每个空类分配一定的空间,通常是1字节。

这样,即使是空类,也能保证每个实例都有不同的地址。

# C++之父的解释

更多可以看 C++ 之父对于这个问题的解释 sizeof-empty (opens new window):

翻译下就是:

为了确保两个不同对象的地址不同。出于相同的原因,“new”总是返回指向不同对象的指针。

考虑以下示例:

class Empty { };

void f()
{
    Empty a, b;
    if (&a == &b) cout << "impossible: report error to compiler supplier";

    Empty* p1 = new Empty;
    Empty* p2 = new Empty;
    if (p1 == p2) cout << "impossible: report error to compiler supplier";
}

有一个有趣的规则是:如果一个空类做基类,那么在派生类中不需要用一个单独的字节来表示,例如

struct X : Empty {
  int a;
  // ...
};

void f(X* p)
{
  void* p1 = p;
  void* p2 = &p->a;
  if (p1 == p2) cout << "nice: good optimizer";
}

上面说明了 p1 和 p2(成员变量a的地址)所指向相同的地方,也就是父类没有占空间。

这种优化允许使用空类来表示一些简单的概念,而且无需额外开销。

大多数编译器都提供了这种“空基类优化”。

最新原创的文章都先发布在公众号,欢迎关注哦~,
扫描下方二维码回复「CS」可以获得我汇总整理的计算机学习资料~

编程指北图片
@2021-2024 编程指北 版权所有 粤ICP备2021169086号-2