【C++】013、空类占多少字节?

一、空类占1字节

  • 在绝大多数编译器下,一个空类的sizeof结果是1字节。

  • 用于保存内存中拥有的唯一地址

二、为什么是1字节

  • 在C++中,任何完整的对象在内存中都必须具有唯一的地址
cpp 复制代码
class Empty {};

int main() {
    Empty e1, e2;
    std::cout << sizeof(Empty) << std::endl; // 输出:1
    std::cout << &e1 << " " << &e2 << std::endl; // 输出两个不同的地址(说明确实占了1字节,地址不同)
}

三、空基类优化(EBO)

  • 如果空类作为基类被继承,编译器通常不会为基类对象分配那1字节内存,而是直接复用派生类的空间

  • 可以理解为空基类是邮戳,派生类的地址是信封,基类地址在派生类空间内,直接复用。

cpp 复制代码
class EmptyBase {};

class Derived : public EmptyBase {
    int x; // 4 字节(不考虑对齐)
};

int main() {
    std::cout << sizeof(EmptyBase) << std::endl; // 输出:1
    std::cout << sizeof(Derived) << std::endl;   // 输出:4(而不是 5!)
    // 编译器没有为 EmptyBase 分配那额外的 1 字节,直接复用了 Derived 的空间。
}

四、有虚函数的基类,大小不是1字节

  • 因为虚函数会创建虚表指针,大小不是1
cpp 复制代码
class EmptyWithVFunc {
public:
    virtual void foo() {}
};
std::cout << sizeof(EmptyWithVFunc) << std::endl; // 64位输出 8
相关推荐
Ricky_Theseus1 小时前
并查集:连通性问题
算法
Tairitsu_H2 小时前
[LC优选算法#18] 前缀和 | 除⾃⾝以外数组的乘积 | 和为K的⼦数组 | 和可被K整除的⼦数组
算法·前缀和·哈希算法
凯瑟琳.奥古斯特2 小时前
力扣1008:前序重建BST
开发语言·c++·算法·leetcode·职场和发展
aqiu1111113 小时前
【算法日记 13】LeetCode 49. 字母异位词分组:哈希表的进阶“降维打击”
算法·leetcode·散列表
KaMeidebaby3 小时前
卡梅德生物技术快报|纳米抗体技术全套实操流程:AFB1 全合成文库淘选 + 分子对接定点突变参数手册
人工智能·python·tcp/ip·算法·机器学习
巴糖4 小时前
从做早餐理解 DAG 与拓扑排序:任务依赖图的核心逻辑
算法
2601_962851744 小时前
计算机毕业设计之基于YOLOV10的低光照目标检测算法研究与实现
大数据·算法·yolo·目标检测·信息可视化·cnn·课程设计
magicwt4 小时前
快手自动出价论文GAVE阅读笔记
算法
智者知已应修善业4 小时前
【P12159蓝桥杯数组翻转】2025-4-24
c语言·c++·经验分享·笔记·算法·蓝桥杯