程序运行时enum是否占用内存?

时间:2022-12-25 00:10:44
现在有个程序要运行在一个嵌入式系统里,因为内存很小(4MB),所以会考虑内存使用。

大量的enum是否会导致内存被占用?
以前的代码是使用#define,但是#define重定义是个问题。(更何况这个代码不是一个人写的).
以前可以运行的程序运行都没有问题,
似乎我用enum替代了#define之后,总是因为内存不足导致程序崩溃(也有可能是我其他地方代码错误)。

// way A
#define MAX_CHAR_ARRAY_LENGTH 32

// way B
enum __em_define_
{
  MAX_CHAR_ARRAY_LENGTH = 32,
};

// way C
const int MAX_CHAR_ARRAY_LENGTH = 32;


way C这个是否会浪费很多内存?
这个会占用常量区,具体这个常量区属于系统还是属于当前程序,我就不知道了。
--------------
想问一下,way B或way C是否会造成多余的内存浪费?
或者有什么办法可以解决宏重定义的问题?
注:代码会分为在linux和window两个版本。

39 个解决方案

#1


enum的元素不占任何内存。但是如果你要定义enum变量的话是会占内存的.

#2


enum会占用,不过只有一个字节,这么介意么?三个里面,1不占内存 2占1个char,3占一个int

#3


用预编译指令呢?
#ifdef XXXXXXX
define something
#else
define something
#endif

#4


那如果emun里枚举了148个成员,数字最大为0xFFFFFFA0。
那么这个时候enum会占用多少内存?

引用 2 楼  的回复:
enum会占用,不过只有一个字节,这么介意么?三个里面,1不占内存 2占1个char,3占一个int

#5


a是肯定不占内存的;b我没法告诉你占不占内存(详见我给你的例子);c可能占也可能不占(你按照最坏的情况考虑,就当作“占内存”处理好了)
下面是我给你举的例子:
enum __em_define_
{
  MAX_CHAR_ARRAY_LENGTH = 32,
};
这个enum的话:
int i;//i肯定占内存。你懂得...

i = MAX_CHAR_ARRAY_LENGTH;//MAX_CHAR_ARRAY_LENGTH不会占数据段内存,编译后会直接变成i = 32;

但如果是下面的代码:
__em_define_ m = MAX_CHAR_ARRAY_LENGTH;
这里的m肯定是会占内存的,因为它是个变量了...

#6


变量当然占用内存。

#7


感觉不是这个导致的,这个根本占不了多少内存,
如果是工程超大的话,根本就在4MB下跑不起来,感觉是其他地方问题

#8


可否说的详细一下?

引用 3 楼  的回复:
用预编译指令呢?
#ifdef XXXXXXX
define something
#else
define something
#endif

#9


引用 2 楼  的回复:
enum会占用,不过只有一个字节,这么介意么?三个里面,1不占内存 2占1个char,3占一个int

2占一个char??谁告诉你的...

#10


引用 4 楼  的回复:
那如果emun里枚举了148个成员,数字最大为0xFFFFFFA0。
那么这个时候enum会占用多少内存?

引用 2 楼  的回复:

enum会占用,不过只有一个字节,这么介意么?三个里面,1不占内存 2占1个char,3占一个int

跟数字没关系,只跟成员数目有关,148也一样是1个字节, 超过256就是2个,超过65536就是3个,类推

#11


百度了一下,enum是不占空间,大概是我搞错了,怎么记成跟数目有关了?

#12


这个问题有考虑过,但是我该如何验证?
我在VS的编译器中测试,
发现编译出来的目标程序大小没有任何变化。
但是运行之后,大小就有了变化。
还发现,同一份代码,编译出来运行之后运行占用的大小也不一样。
编译器vs2005。

引用 7 楼  的回复:
感觉不是这个导致的,这个根本占不了多少内存,
如果是工程超大的话,根本就在4MB下跑不起来,感觉是其他地方问题

#13


引用 10 楼  的回复:
跟数字没关系,只跟成员数目有关,148也一样是1个字节, 超过256就是2个,超过65536就是3个,类推


不对.

#14


我用vs2005测试,发现我添加一个变量,查看整个内存的使用量却没有变化。
谁可以提供一种测试方法?

#include <stdio.h>

enum __em_define_
{
t1,t2,t3,
};

int main()
{

//int a = t1;  //加这段与不加这段,进程占用的内存空间竟然都一样!
char c = getchar();
return 0;
}


#15


enum 的定义是不占用内存的,一般 使用了枚举类型才会占用。
就像我们定义class  是不占用 运行间的内存的,但是会占用代码段内存,但是 enum 是什么都不占用的,因为在编译阶段就被处理了。

#16


你知道 4M 有多大么? 够你定义1000000 个int 了.
考虑下你的算法的优化吧.\


另外,enum 的定义不占运行时内存.无论里面有多少个元素.
enum 变量会占内存.

#17


第1种不占内存,因为在预编译的时候会宏替换。
第3种是定义性声明了一个变量,占内存的。
第2种是如果是定义了一个枚举类型enum __em_define_ 变量也会占内存的,因为同第3种一样要存储变量,需要空间。
但是,在定义枚举类型enum __em_define_时里面的枚举常量占不占内存我就不清楚啦!!求高人指点。

#18


内存分配有最小的粒度,多用1字节根本看不出变化,而且可能优化掉,变量不一定会占内存,只是逻辑上会给它一个空间,这个空间实现起来可以是内存,可以是寄存器,也可以啥都没有

#19


引用 16 楼  的回复:
你知道 4M 有多大么? 够你定义1000000 个int 了.
考虑下你的算法的优化吧.\


另外,enum 的定义不占运行时内存.无论里面有多少个元素.
enum 变量会占内存.

这样的话,定义时那些枚举常量怎么处理的?存储在哪里?

#20


定义那些是编译器处理的,定义多了会让编译器用更多资源

#21


语法元素——内存占用量,这之间根本没有关系。

#22


引用 19 楼  的回复:
这样的话,定义时那些枚举常量怎么处理的?存储在哪里?

枚举常量不用存储的。哪里用到了,编译器就在那里把枚举名替换成对应的常数就可以了。
况且这种不存储的行为已经作为语法标准了,你完全不用考虑会不会被你用的编译器的厂商兼容的问题。如果有意外的话那也是厂商自己的问题,标准都不遵循...

#23


枚举常量应该不占用内存。编译器会给优化,多些一个和少些一个根本就看不出来

#24


这样的话和宏没什么区别了
引用 22 楼  的回复:
引用 19 楼 的回复:
这样的话,定义时那些枚举常量怎么处理的?存储在哪里?

枚举常量不用存储的。哪里用到了,编译器就在那里把枚举名替换成对应的常数就可以了。
况且这种不存储的行为已经作为语法标准了,你完全不用考虑会不会被你用的编译器的厂商兼容的问题。如果有意外的话那也是厂商自己的问题,标准都不遵循...

#25


引用 24 楼  的回复:
这样的话和宏没什么区别了


比宏更严格吧,枚举常量形式上有自己的类型的。宏就没有。

#26


引用 24 楼  的回复:
这样的话和宏没什么区别了

enum有类型检查但没法#ifdef。

#27


enum和宏定义,你可以认为它们是一样一样滴。
enum就是把一组相关的宏定义组织起来。

#28


enum 的元素和enum 本身都是实体,它的名字是要遵循C语言关于域的规定的.

而宏纯粹是简单地替代文本,是在编译前做的事...没有语法解析之类的..

编译器不用运行时内存可以做的事很多...比如类型检查, sizeof(..)的值,等等,..

enum 变量的值的变化范围在枚举的值s中.

#29


楼上应该说,,编译器做的事本身就是不用运行时内存做的...
这个是生成代码的过程...
编译器会知道什么是常量,什么不是.

#30


都只有理论。
暂时结贴了。
---------------------------------------------------
谁能给个实际可以测试出结果的做法么?

#31


引用 30 楼  的回复:
谁能给个实际可以测试出结果的做法么?


有空的话约个时间我给你代码测试。为了测试的公平性,里面用到了很多宏用来建立巨型数据。。。
代码很难看。不过,结合编译器里面的类型查看工具,还是比较明白的...

#32


enum是声明吧,应该不占内存的.在这个例子里 enum{MAX_ARRAY_LENGTH}跟#define MAX_ARRAY_LENGTH完全一样.const int MAX_ARRAY_LENGTH这个要占内存,不过也仅仅是一个int.没多大内存.

#33


变量占不占内存?看我的解释对不对:

函数中定义的变量,既可以说占内存,也可以说不占。

当你开启了一个线程(包括主线程),那么这个线程就已经占死了2M栈空间(假设编译选项的设定是2M)的内存。
如果线程调用了这个函数,那么它在自己的栈空间内为这个函数保留一块空间给函数的变量用(压栈)。

只要你的线程不无限压栈(比如递归)2M空间够用,那么可以说,函数中的变量大一点也不浪费了,因为栈空间已经固定死了,你线程不用,别的线程也用不了,new也用不了。

#34


真心的希望,在解答别人的问题的时候最好能用一些生活中的例子,我始终坚信任何问题的解决描述都核可找到一个合适的现实中的例子的,这样别人理解起来会容易的!当然,如果你不屑于这样的话,那我就没话说了!

#35


比较恶心的办法是反汇编,看看到底有没有占内存,编译器对常量会有优化,不同的编译器也会有不同的处理方式。

#36


#include "stdafx.h"
int main(int argc, char* argv[])
{
 enum EN
 {
  e_invalid = 0,
  e_1,
  e_2,
  e_3,
  e_4,
  e_5,
 }my_enum;
 printf("my enum is %d byte size\n", sizeof(my_enum));
 return 0;
}
 
运行结果:
my enum is 4 byte size

#37


enum变量都占用4个字节,不管里面的枚举值有多少个

#38


引用 37 楼  的回复:
enum变量都占用4个字节,不管里面的枚举值有多少个


他担心的是枚举值占不占内存,不是枚举变量。

#39


是的,
枚举类型的变量是肯定占内存的。

引用 38 楼  的回复:
引用 37 楼  的回复:
enum变量都占用4个字节,不管里面的枚举值有多少个


他担心的是枚举值占不占内存,不是枚举变量。

#1


enum的元素不占任何内存。但是如果你要定义enum变量的话是会占内存的.

#2


enum会占用,不过只有一个字节,这么介意么?三个里面,1不占内存 2占1个char,3占一个int

#3


用预编译指令呢?
#ifdef XXXXXXX
define something
#else
define something
#endif

#4


那如果emun里枚举了148个成员,数字最大为0xFFFFFFA0。
那么这个时候enum会占用多少内存?

引用 2 楼  的回复:
enum会占用,不过只有一个字节,这么介意么?三个里面,1不占内存 2占1个char,3占一个int

#5


a是肯定不占内存的;b我没法告诉你占不占内存(详见我给你的例子);c可能占也可能不占(你按照最坏的情况考虑,就当作“占内存”处理好了)
下面是我给你举的例子:
enum __em_define_
{
  MAX_CHAR_ARRAY_LENGTH = 32,
};
这个enum的话:
int i;//i肯定占内存。你懂得...

i = MAX_CHAR_ARRAY_LENGTH;//MAX_CHAR_ARRAY_LENGTH不会占数据段内存,编译后会直接变成i = 32;

但如果是下面的代码:
__em_define_ m = MAX_CHAR_ARRAY_LENGTH;
这里的m肯定是会占内存的,因为它是个变量了...

#6


变量当然占用内存。

#7


感觉不是这个导致的,这个根本占不了多少内存,
如果是工程超大的话,根本就在4MB下跑不起来,感觉是其他地方问题

#8


可否说的详细一下?

引用 3 楼  的回复:
用预编译指令呢?
#ifdef XXXXXXX
define something
#else
define something
#endif

#9


引用 2 楼  的回复:
enum会占用,不过只有一个字节,这么介意么?三个里面,1不占内存 2占1个char,3占一个int

2占一个char??谁告诉你的...

#10


引用 4 楼  的回复:
那如果emun里枚举了148个成员,数字最大为0xFFFFFFA0。
那么这个时候enum会占用多少内存?

引用 2 楼  的回复:

enum会占用,不过只有一个字节,这么介意么?三个里面,1不占内存 2占1个char,3占一个int

跟数字没关系,只跟成员数目有关,148也一样是1个字节, 超过256就是2个,超过65536就是3个,类推

#11


百度了一下,enum是不占空间,大概是我搞错了,怎么记成跟数目有关了?

#12


这个问题有考虑过,但是我该如何验证?
我在VS的编译器中测试,
发现编译出来的目标程序大小没有任何变化。
但是运行之后,大小就有了变化。
还发现,同一份代码,编译出来运行之后运行占用的大小也不一样。
编译器vs2005。

引用 7 楼  的回复:
感觉不是这个导致的,这个根本占不了多少内存,
如果是工程超大的话,根本就在4MB下跑不起来,感觉是其他地方问题

#13


引用 10 楼  的回复:
跟数字没关系,只跟成员数目有关,148也一样是1个字节, 超过256就是2个,超过65536就是3个,类推


不对.

#14


我用vs2005测试,发现我添加一个变量,查看整个内存的使用量却没有变化。
谁可以提供一种测试方法?

#include <stdio.h>

enum __em_define_
{
t1,t2,t3,
};

int main()
{

//int a = t1;  //加这段与不加这段,进程占用的内存空间竟然都一样!
char c = getchar();
return 0;
}


#15


enum 的定义是不占用内存的,一般 使用了枚举类型才会占用。
就像我们定义class  是不占用 运行间的内存的,但是会占用代码段内存,但是 enum 是什么都不占用的,因为在编译阶段就被处理了。

#16


你知道 4M 有多大么? 够你定义1000000 个int 了.
考虑下你的算法的优化吧.\


另外,enum 的定义不占运行时内存.无论里面有多少个元素.
enum 变量会占内存.

#17


第1种不占内存,因为在预编译的时候会宏替换。
第3种是定义性声明了一个变量,占内存的。
第2种是如果是定义了一个枚举类型enum __em_define_ 变量也会占内存的,因为同第3种一样要存储变量,需要空间。
但是,在定义枚举类型enum __em_define_时里面的枚举常量占不占内存我就不清楚啦!!求高人指点。

#18


内存分配有最小的粒度,多用1字节根本看不出变化,而且可能优化掉,变量不一定会占内存,只是逻辑上会给它一个空间,这个空间实现起来可以是内存,可以是寄存器,也可以啥都没有

#19


引用 16 楼  的回复:
你知道 4M 有多大么? 够你定义1000000 个int 了.
考虑下你的算法的优化吧.\


另外,enum 的定义不占运行时内存.无论里面有多少个元素.
enum 变量会占内存.

这样的话,定义时那些枚举常量怎么处理的?存储在哪里?

#20


定义那些是编译器处理的,定义多了会让编译器用更多资源

#21


语法元素——内存占用量,这之间根本没有关系。

#22


引用 19 楼  的回复:
这样的话,定义时那些枚举常量怎么处理的?存储在哪里?

枚举常量不用存储的。哪里用到了,编译器就在那里把枚举名替换成对应的常数就可以了。
况且这种不存储的行为已经作为语法标准了,你完全不用考虑会不会被你用的编译器的厂商兼容的问题。如果有意外的话那也是厂商自己的问题,标准都不遵循...

#23


枚举常量应该不占用内存。编译器会给优化,多些一个和少些一个根本就看不出来

#24


这样的话和宏没什么区别了
引用 22 楼  的回复:
引用 19 楼 的回复:
这样的话,定义时那些枚举常量怎么处理的?存储在哪里?

枚举常量不用存储的。哪里用到了,编译器就在那里把枚举名替换成对应的常数就可以了。
况且这种不存储的行为已经作为语法标准了,你完全不用考虑会不会被你用的编译器的厂商兼容的问题。如果有意外的话那也是厂商自己的问题,标准都不遵循...

#25


引用 24 楼  的回复:
这样的话和宏没什么区别了


比宏更严格吧,枚举常量形式上有自己的类型的。宏就没有。

#26


引用 24 楼  的回复:
这样的话和宏没什么区别了

enum有类型检查但没法#ifdef。

#27


enum和宏定义,你可以认为它们是一样一样滴。
enum就是把一组相关的宏定义组织起来。

#28


enum 的元素和enum 本身都是实体,它的名字是要遵循C语言关于域的规定的.

而宏纯粹是简单地替代文本,是在编译前做的事...没有语法解析之类的..

编译器不用运行时内存可以做的事很多...比如类型检查, sizeof(..)的值,等等,..

enum 变量的值的变化范围在枚举的值s中.

#29


楼上应该说,,编译器做的事本身就是不用运行时内存做的...
这个是生成代码的过程...
编译器会知道什么是常量,什么不是.

#30


都只有理论。
暂时结贴了。
---------------------------------------------------
谁能给个实际可以测试出结果的做法么?

#31


引用 30 楼  的回复:
谁能给个实际可以测试出结果的做法么?


有空的话约个时间我给你代码测试。为了测试的公平性,里面用到了很多宏用来建立巨型数据。。。
代码很难看。不过,结合编译器里面的类型查看工具,还是比较明白的...

#32


enum是声明吧,应该不占内存的.在这个例子里 enum{MAX_ARRAY_LENGTH}跟#define MAX_ARRAY_LENGTH完全一样.const int MAX_ARRAY_LENGTH这个要占内存,不过也仅仅是一个int.没多大内存.

#33


变量占不占内存?看我的解释对不对:

函数中定义的变量,既可以说占内存,也可以说不占。

当你开启了一个线程(包括主线程),那么这个线程就已经占死了2M栈空间(假设编译选项的设定是2M)的内存。
如果线程调用了这个函数,那么它在自己的栈空间内为这个函数保留一块空间给函数的变量用(压栈)。

只要你的线程不无限压栈(比如递归)2M空间够用,那么可以说,函数中的变量大一点也不浪费了,因为栈空间已经固定死了,你线程不用,别的线程也用不了,new也用不了。

#34


真心的希望,在解答别人的问题的时候最好能用一些生活中的例子,我始终坚信任何问题的解决描述都核可找到一个合适的现实中的例子的,这样别人理解起来会容易的!当然,如果你不屑于这样的话,那我就没话说了!

#35


比较恶心的办法是反汇编,看看到底有没有占内存,编译器对常量会有优化,不同的编译器也会有不同的处理方式。

#36


#include "stdafx.h"
int main(int argc, char* argv[])
{
 enum EN
 {
  e_invalid = 0,
  e_1,
  e_2,
  e_3,
  e_4,
  e_5,
 }my_enum;
 printf("my enum is %d byte size\n", sizeof(my_enum));
 return 0;
}
 
运行结果:
my enum is 4 byte size

#37


enum变量都占用4个字节,不管里面的枚举值有多少个

#38


引用 37 楼  的回复:
enum变量都占用4个字节,不管里面的枚举值有多少个


他担心的是枚举值占不占内存,不是枚举变量。

#39


是的,
枚举类型的变量是肯定占内存的。

引用 38 楼  的回复:
引用 37 楼  的回复:
enum变量都占用4个字节,不管里面的枚举值有多少个


他担心的是枚举值占不占内存,不是枚举变量。