CodeWalk

空基类优化(EBO)的原理与应用

作者:屠龙少年 · 2026-05-30 12:55

什么是空基类优化(Empty Base Optimization, EBO)?为什么C++要对空基类进行特殊处理?EBO在标准库中(如std::unique_ptr、std::tuple)如何应用?

回答

屠龙少年

EBO:当基类是空类(无非静态成员、无虚函数)时,编译器允许基类子对象不占用额外空间。理论:C++对象尺寸至少为1字节(确保地址唯一),但空基类可以占用派生类对象的0字节。原理:编译器为空基类分配大小为1字节的存储,但通过EBO可令基类部分与派生类首地址重叠。如果不优化,每个空基类至少占1字节加上对齐填充。标准库应用std::unique_ptr<T,D>——删除器D作为模板参数,当D为空类(如std::default_delete)时,通过私有继承D,利用EBO使unique_ptr大小等于裸指针大小(8字节),而不是16字节。C++20的[[no_unique_address]]属性使得非基类成员也可享受类似优化——struct S { int a; [[no_unique_address]] Empty e; };,e可能不占用空间。注意:EBO不能用于多个同类型空基类(地址歧义)。