为何含枚举的C++类大小为1?枚举是否占用内存?
关于带枚举的C++类大小与枚举内存的问题解答
嘿,咱们一步步把这两个问题掰明白:
一、为什么声明了枚举的C++类大小是1?
首先得搞清楚核心点:枚举是类型定义,不属于类的非静态数据成员。
在C里,一个类如果没有任何非静态数据成员、虚函数,也没有继承其他带内存开销的类,那它的大小会被编译器设置为1字节——这是C标准的硬性要求,目的是让同一个类的不同实例能拥有独一无二的内存地址(要是大小为0,数组里的多个对象会挤在同一个地址上,这显然不符合逻辑)。
回到你给出的test类:它里面只有两个枚举类型的定义,没有任何需要占用实例内存的成员(比如int、string这类数据成员,或者虚函数表指针),所以编译器给它分配了1字节的“占位空间”,这就是类大小为1的原因。
二、为什么类大小不是8?为什么输出test::ONE是1但枚举不占内存?
你可能误以为每个枚举会像int那样占用4字节,但实际情况是:
- 枚举本身是编译期常量集合,枚举成员(比如
ZERO、ONE)都是编译时就确定的整数值,它们并不存储在类的实例内存里。你写test::ONE的时候,编译器直接把它替换成对应的常量值(这里是1,因为默认第一个枚举成员是0,后面依次递增1),所以输出的1只是这个常量的值,和类实例的内存完全没关系。 - 至于为什么不是8?因为两个枚举只是类型定义,不会给类实例增加任何内存开销,这个类本质上还是没有实际数据成员的“空类”,所以大小还是1,不是你以为的两个枚举各占4字节加起来8。
再补个小知识点:要是你在类里定义静态数据成员,它也不会占用类实例的内存,因为静态成员存在全局内存区域,不属于某个具体实例;只有非静态数据成员、虚函数表指针这类才会算进类的大小里。
内容的提问来源于stack exchange,提问作者Vignesh Rajendran
相关产品推荐
相关产品推荐

