空类 Zero Sized Types

Vec 中对空类的优化

C++ 中的空类

先看代码示例:

#include <cassert>

#include<iostream>

class Empty { };

class ContainsEmpty {
 public:
  int x;
  Empty e;
};

class WithEBO: public Empty {
 public:
  int x;
};

int main() {
  Empty e1;
  Empty e2;
  assert(&e1 != &e2);
  assert(sizeof(Empty) == 1);

  assert(sizeof(ContainsEmpty) == 8);
  assert(sizeof(WithEBO) == sizeof(int));

  return 0;
}

尽管上面的 Empty 类是一个空的类, 它仍然要占用1个字节的内存.

C++ 对空类的优化: EBO Empty Base Optimization

通过横向对比可以看到, 这两种语言在处理空类的问题上的方法并不相同, 而Rust中的做法更符合常理, 心智负担也更小.