You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何含枚举的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:24:47