【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
相关推荐
吴声子夜歌7 小时前
ApacheCommons——commons-configuration2(多数据源配置统一管理与热加载)
java·开发语言·算法·apache
kyle~7 小时前
奇异值分解(SVD)
人工智能·算法·机器学习
HugoStudio_SWAN7 小时前
洛谷 B4502 [GESP202603 四级] 礼盒排序——多关键字排序与排名计数法
算法
计科杨某人7 小时前
简单算法题(基础入门题)
c++·算法·题解·入门·基础算法
Q一件事7 小时前
RWEQ计算——Wf因子
算法
zander2587 小时前
LeetCode 64. 最小路径和
算法·深度优先
find1star16 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing16 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB211216 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP17 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理