查看: 6|回复: 0

c++中一个空类占多少空间的自我理解

[复制链接]

10

主题

4

回帖

2万

积分

论坛元老

积分
20067
发表于 昨天 07:46 来自手机 | 显示全部楼层 |阅读模式
C++ 空类大小

class Empty {};
cout << sizeof(Empty);

结论

标准C++规定:空类大小 ≠ 0,一般占 1 字节。

为什么不是0?

C++要求:同一个类的两个对象,必须拥有不同唯一内存地址。
如果空类大小为0:

Empty a, b;
// &a 和 &b 有可能是同一个地址,标准不允许!


编译器分配1个哑元字节(dummy byte),仅仅用来区分对象地址,这个字节不存储任何有效数据。

重要特例(高频考点)

1. 空类被继承的时候

class Empty {};
class Test : public Empty
{
    int x;
};
// sizeof(Test) = 4
// 基类空类的1字节会被优化掉 → 空基类优化 EBCO


✅ 空基类优化 EBCO:当空类作为父类,派生类拥有成员变量时,空基类不需要额外占用空间。

⚠️注意:只有单一继承、public/protected继承主流编译器支持EBCO;多重继承容易失效。

2. 如果空类里面包含虚函数
  
class EmptyVirt {
public:
    virtual void func(){}
};
// sizeof(EmptyVirt) = 8 (64位系统) / 4 (32位)


一旦有虚函数,类会产生虚表指针(vptr),不再是空类,大小等于指针宽度。

汇总速记

1.  class A{}  无任何东西:1字节
2.  class A{virtual f();} :大小 = 机器指针大小(64位=8)
3. 空类作为父类,子类有成员:空基类优化,不额外增加大小
4. C语言struct没有这套规则,C没有类,不要混淆

补充验证代码

#include <iostream>
using namespace std;

class Empty {};

class EmptyV {
public:
    virtual void test(){}
};

int main()
{
    cout << sizeof(Empty) << endl;    // 输出 1
    cout << sizeof(EmptyV) << endl;   // 64位输出 8
    return 0;
}

空结构体(C语言)和C++空类的区别:

C语言空结构体 vs C++空类 完整对比

1、C语言:空结构体

c
  
struct Empty {
   
};


C标准(C89/C99)不允许定义无成员的结构体!语法报错。

GCC扩展特性:允许空struct,此时  sizeof(struct Empty) = 0
⚠️ 这属于编译器拓展,不是标准C,不能跨编译器移植。

测试(GCC环境):

#include <stdio.h>
struct Empty {};
int main() {
    printf("%zu", sizeof(struct Empty)); // GCC输出0,MSVC直接编译报错
    return 0;
}


2、C++空类

class Empty {};


C++标准合法定义, sizeof(Empty) == 1
原因前面讲过:保证两个不同对象地址不同。

3、核心差异汇总表

项目 C 空struct C++ 空类 Empty{}
标准合法性 标准禁止,GCC拓展支持 C++标准合法
sizeof大小 GCC下0,MSVC报错 固定1字节(无虚函数)
设计目的 C没有对象模型、没有this指针 C++面向对象,区分不同实例地址
能否实例化 拓展下可以,但两个实例可能同地址 可以实例化,a、b地址一定不同

延伸易混考点

① C++ struct 和 class 是空的时候完全一致

struct S{};
class C{};
// sizeof(S) == sizeof(C) == 1


C++中struct只是默认public,内存布局规则和class一模一样。

② 空基类优化 EBCO 再巩固(C++独有)

class Empty{};
struct Derive : Empty {
    int a;
};
// sizeof(Derive) = 4;空父类1字节被优化消除


前提:单一继承;多重继承时EBCO经常失效。

③ 边界思考题,你可以自测

class A{};
class B{};
class C : A,B{};
cout << sizeof(C); // 答案:1


多重继承两个空类,依然占用1字节(主流编译器)。

class A{};
class C:A{ char ch; };
cout << sizeof(C); // 答案:1,EBCO生效


简单记忆口诀

- C语言:标准不让有空结构体,GCC玩特例size=0;
- C++空类:裸空1字节;有空基类能优化;带虚函数=指针大小。
路要慢慢走才有味!致最爱的游戏Darkeden
您需要登录后才可以回帖 登录 | 暂停注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
返回顶部