递归函数中枚举类型的初始化机制:是否会被多次创建?
递归函数中枚举类型的创建机制与内存问题分析
递归中的枚举不会被多次创建
枚举类型是编译期处理的语法元素,不是运行时需要分配内存的对象。编译器在编译阶段就会完成enum someEnum的定义处理,确定UP、DOWN、LEFT、RIGHT这些枚举常量的取值(默认从0开始依次递增),并将它们的作用域限定在recuFun函数内部。当程序运行、递归调用函数时,不会重复“创建”这个枚举类型——它从始至终都只是编译阶段的语法标记,和运行时的内存分配完全无关。和
#define的核心区别#define是预处理器的纯文本替换指令,没有作用域限制,只要在定义后的代码都会被替换,甚至跨文件生效(如果在头文件中定义并被包含),而且替换内容没有类型信息,编译器不会做类型检查。- 枚举是C/C++的原生语言特性,有严格的作用域(这里就是函数内部),枚举常量自带类型(默认是
int),编译器会对其进行类型校验,比#define更安全规范。
完全不存在内存浪费问题
你担心的内存浪费完全没必要:枚举类型本身不会占用运行时内存,枚举常量也只是编译期确定的常量值,不会在函数栈或堆中分配空间。递归调用时,函数栈里只会存储局部变量、返回地址等运行时必需的数据,枚举定义不会产生任何额外的内存开销。
针对你给出的示例代码:
void recuFun() { enum someEnum {UP, DOWN, LEFT, RIGHT}; // 编译期处理,运行时无操作 /* ... */ recuFun(); }
这里的枚举定义只会在编译阶段被处理一次,运行时每次进入recuFun都不会对这个定义做任何操作,不会有重复创建的情况,也不会消耗额外内存。
内容的提问来源于stack exchange,提问作者Igor Zeck
相关产品推荐
相关产品推荐

