C++类空类大小为1个字节

Sre*_*yan 9 c++ sizeof

我是C++的新手,在C++中发现了一个特殊的功能.我看到一个空的大小是1个字节,我做了一些研究,发现这是完成的,因为每个对象必须有一个不同的地址.但是我想知道放置的那个1字节的内容是什么.我知道它不会持有"this"指针,但它是一个虚拟字节还是实际上有一些内容?

Luc*_*ore 11

没有内容.它只是一个虚拟字节.

每一个classstruct必须有它的sizeof大于0,你的行为.这是标准的预期和强制要求.


Mat*_* M. 8

标准强制要求相同类型的不同对象具有不同的地址.这反过来确保对于任何对象T,T*充当该对象的明确标识符(对于此类型).

当然,您通常不需要知道两个对象是否真的相同或不同,但有时(给定C++低级访问)这是必要的或者只是简单方便.

因此指定没有对象应该具有空大小.

但是这个规则有一个例外:当使用空类作为基类时,编译器可能会选择在某些情况下应用空基优化(EBO),例如:

struct Empty {};

struct Slim: Empty {
  int a;
};

static_assert(sizeof(Slim) == sizeof(int), "");
Run Code Online (Sandbox Code Playgroud)

通常会添加基类的大小,但在这种特殊情况下,它不是必需的.但是,相同类型的两个不同对象永远不应具有相同地址的规则仍然适用,因此:

struct Fat: Empty {
  Empty e;
};

static_assert(sizeof(Fat) > sizeof(Empty), "");
Run Code Online (Sandbox Code Playgroud)

EBOprivate在模板情况下使用继承的主要原因.例如:

template <typename Allocator>
class MyClass: private Allocator {
};
Run Code Online (Sandbox Code Playgroud)

这样,如果结果Allocator是空类,则不会有任何开销.通常,它通常用于策略,例如传递给的谓词map.