我是C++的新手,在C++中发现了一个特殊的功能.我看到一个空的大小是1个字节,我做了一些研究,发现这是完成的,因为每个对象必须有一个不同的地址.但是我想知道放置的那个1字节的内容是什么.我知道它不会持有"this"指针,但它是一个虚拟字节还是实际上有一些内容?
标准强制要求相同类型的不同对象具有不同的地址.这反过来确保对于任何对象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)
EBO是private在模板情况下使用继承的主要原因.例如:
template <typename Allocator>
class MyClass: private Allocator {
};
Run Code Online (Sandbox Code Playgroud)
这样,如果结果Allocator是空类,则不会有任何开销.通常,它通常用于策略,例如传递给的谓词map.
| 归档时间: |
|
| 查看次数: |
5784 次 |
| 最近记录: |