是sizeof(枚举)== sizeof(int),总是?
是sizeof(枚举)== sizeof(int),总是?
- 还是编译器依赖?
- 是不是说错了,因为编译器是针对字长(内存alignment)进行优化的,即y int是特定编译器的字大小? 这是否意味着如果我使用枚举就没有处理惩罚,因为它们是字alignment的?
- 如果我把所有的返回代码放在一个枚举中,不是更好,因为我显然不担心它的值,只检查返回types的名字。 如果是这种情况,#DEFINE会更好,因为它可以节省内存。
通常的做法是什么? 如果我必须通过networking传输这些返回types,并且必须在另一端执行一些处理,那么您希望枚举/#define / const ints是什么。
编辑 – 只要在网上检查,作为编译器不象征性地链接macros,那么人们如何debugging,比较整数值与头文件?
从答案 – 我在下面添加这一行,因为我需要澄清 –
“所以它是实现定义的,sizeof(枚举) 可能等于sizeof(char),即1。
- 这不是说编译器检查枚举值的范围,然后分配内存。 我不这么认为,当然我不知道。 有人可以解释我什么是“可能”。
它依赖于编译器,可能在枚举之间有所不同。 以下是语义
enum X { A, B }; // A has type int assert(sizeof(A) == sizeof(int)); // some integer type. Maybe even int. This is // implementation defined. assert(sizeof(enum X) == sizeof(some_integer_type));
请注意,C99中的“某些整数types”也可能包含扩展整数types(但是,如果提供这些types,实现必须进行文档化)。 枚举的types是某种types,可以存储任何枚举数的值(在这种情况下为A
和B
)。
我不认为使用枚举有任何处罚。 枚举器也是不可或缺的常量expression式(例如,您可以使用它来初始化静态或文件作用域variables),并且我更喜欢它们尽可能使用macros。
枚举器不需要任何运行时内存。 只有在创build枚举types的variables时,才可以使用运行时内存。 只要将枚举器看作编译时间常量即可。
我只是使用一个types,可以存储枚举值(我应该知道大致的值范围之前),投它,并通过networking发送。 最好这个types应该是一些固定宽度的types,比如int32_t
,所以当涉及不同的机器时它不会发生冲突。 或者我会打印这个数字,并在另一边扫描,这样可以消除一些这些问题。
响应编辑
那么,编译器不需要使用任何大小。 容易看到的是值的符号很重要 – 无符号types可以在一些计算中显着提高性能。 以下是我的箱子上的GCC 4.4.0
的行为
int main(void) { enum X { A = 0 }; enum X a; // X compatible with "unsigned int" unsigned int *p = &a; }
但是,如果你指定一个-1
,那么GCCselect使用int
作为X
兼容的types
int main(void) { enum X { A = -1 }; enum X a; // X compatible with "int" int *p = &a; }
使用GCC选项--short-enums
,可以使用最小的types来适应所有的值。
int main() { enum X { A = 0 }; enum X a; // X compatible with "unsigned char" unsigned char *p = &a; }
C99,6.7.2.2p4说
每个枚举types应与char,有符号整数types或无符号整数types兼容。 types的select是实现定义的,但是应该能够表示枚举的所有成员的值。 […]
增加了脚注108
一个实现可能会延迟select哪个整数types,直到看到所有的枚举常量。
所以它是实现定义的,sizeof(enum)可能等于sizeof(char),即1。
在select一些小范围的整数的大小, 总是有一个惩罚。 如果你把它放在内存中,可能会有处理惩罚; 如果你把它放大,会有一定的处罚。 这是一个时间与空间的折衷。
错误代码通常是#defines,因为它们需要是可扩展的:不同的库可能会添加新的错误代码。 你不能用枚举来做到这一点。
是sizeof(枚举)== sizeof(int),总是
ANSI C标准说:
每个枚举types应与char,有符号整数types或无符号整数types兼容。 types的select是实现定义的。 (6.7.2.2枚举规范)
所以我会认为不是。
如果是这种情况,#DEFINE会更好,因为它可以节省内存。
以什么方式使用枚举定义保存内存? 一个枚举只是一个types,允许你提供更多的信息给编译器。 在实际生成的可执行文件中,只是将其转换为整数,就像预处理器将使用#define创build的macros转换为其值。
通常的做法是什么? 如果我必须通过networking传输这些返回types,而另一端则需要处理一些处理
如果您打算通过networking传输值并在另一端处理它们,则应该定义一个协议。 确定每种types的字节大小(字节的顺序),并确保在客户端和服务器代码中都遵守这个规则。 另外,不要只是假设,因为它碰巧工作,你是对的。 例如,您所select的客户端和服务器平台上的永久性可能会匹配,但情况并非总是如此。
没有。
示例: CodeSourcery编译器
当你像这样定义一个枚举:
enum MyEnum1 { A=1, B=2, C=3 }; // will have the sizeof 1 (fits in a char) enum MyEnum1 { A=1, B=2, C=3, D=400 }; // will have the sizeof 2 (doesn't fit in a char)
来自邮件列表的详细信息
在一些编译器中,枚举的大小取决于Enum中有多less条目。 (小于255 Entrys => Byte,大于255 Entrys int)但这取决于编译器和编译器设置。