【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
相关推荐
罗西的思考4 小时前
【Agent OS / AIOS】AOHP 深度解读:当 OS 开始为 Agent 而设计
人工智能·算法·机器学习
民乐团扒谱机4 小时前
【微实验】组合优化matlab实战(马科维茨投资模型):在收益与风险之间,寻找最优的人生配比
大数据·人工智能·算法·机器学习·数学建模·matlab·组合优化
Nil2085 小时前
leetcode 160相交链表
算法·leetcode·链表
迷途之人不知返6 小时前
算法系列2:滑动窗口
算法
Herbert_hwt6 小时前
C语言零基础入门:循环控制与数据类型详解
c语言·数据结构·算法
Tisfy8 小时前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口
-dzk-8 小时前
【技巧】LC 136.只出现一次的数字
算法·异或
有点。8 小时前
C++二叉树二(练习题)
数据结构·c++·算法·图论
专注仿真8 小时前
问答大模型技术方案算法实现-RAPTOR树构建算法与BEG集成使用
python·算法
zlinear数据采集卡9 小时前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源