【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
相关推荐
波尔德8 分钟前
Origin 2024 绘制钟形正态分布曲线:填充颜色并导出透明 PNG
人工智能·算法
Omics Pro19 分钟前
微软:多模态生物世界模型
数据库·人工智能·算法·microsoft·机器学习·自然语言处理
hai31524754325 分钟前
语言学集合定律
人工智能·算法
小溪学编程29 分钟前
C语言篇:语言结构
c语言·开发语言·算法
Ivanqhz1 小时前
KV Cache
服务器·数据库·人工智能·深度学习·算法
H.莓飛1 小时前
【数据结构】二叉树
linux·数据结构·算法
Omics Pro1 小时前
~30,000+引用!理论2005,R包2008,多组学集成AI增强
开发语言·数据库·人工智能·算法·机器学习·自然语言处理·r语言
梦帮科技1 小时前
【3.0修订版】创世与节点工程:genesis.json 与 node.toml 解剖
数据结构·算法·json·去中心化·区块链·智能合约·信任链
影视飓风TIM1 小时前
Linux 进程虚拟地址空间详解
linux·算法
如何原谅奋力过但无声2 小时前
【灵神高频面试题合集21-25】动态规划(下)
算法·动态规划