首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >sizeof(枚举) == sizeof(int),总是吗?

sizeof(枚举) == sizeof(int),总是吗?
EN

Stack Overflow用户
提问于 2009-07-11 14:40:53
回答 6查看 62.7K关注 0票数 60

sizeof(枚举) == sizeof(int),总是吗?

  • 还是依赖于编译器?
  • 这样说是错误的吗,因为编译器针对字长(内存对齐)进行了优化,即y int是特定编译器上的字大小?
  • 如果我把所有的返回代码放在一个枚举中是不是更好,因为我显然不关心它得到的值,只关心在检查返回类型时的名称。如果是这样的话,#DEFINE会更好,因为它会节省内存。

通常的做法是什么?如果我必须通过网络传输这些返回类型,并且必须在另一端进行一些处理,那么您更喜欢什么enum/#定义/ const int。

编辑-只是在网络上检查,因为编译器不会象征性地链接宏,那么人们如何调试,将整数值与头文件进行比较?

从Answers -I中添加下面这一行,因为我需要澄清-

枚举“所以它是由实现定义的,

(枚举)可能是等于sizeof(char),即1。”

  • 并不意味着编译器会检查枚举中的值范围,然后分配内存。我不这么认为,我当然不知道。有人能给我解释一下什么是“可能”吗?
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-07-11 14:49:54

它依赖于编译器,并且在枚举之间可能会有所不同。以下是语义

代码语言:javascript
复制
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中的“某些整数类型”也可能包括扩展的整数类型(但是,如果实现提供了扩展的整数类型,则必须对其进行文档记录)。枚举的类型是某种可以存储任何枚举数的值的类型(在本例中为AB )。

我不认为使用枚举有任何惩罚。枚举器也是整型常量表达式(例如,您可以使用它来初始化静态或文件范围变量),并且我尽可能地更喜欢它们而不是宏。

枚举器不需要任何运行时内存。只有在创建枚举类型的变量时,才可以使用运行时内存。只需将枚举器视为编译时常量即可。

我只需要使用一个可以存储枚举器值的类型(我应该事先知道值的大致范围),转换为它,然后通过网络发送它。最好是固定宽度的类型,比如int32_t,这样当涉及到不同的机器时,就不会出现冲突。或者我会打印号码,然后在另一面扫描,这样就解决了其中的一些问题。

对编辑的响应

编译器不需要使用任何大小。一件容易看到的事情是,值的符号很重要-无符号类型在某些计算中可以有显着的性能提升。以下是我的盒子上的GCC 4.4.0的行为

代码语言:javascript
复制
int main(void) {
  enum X { A = 0 };
  enum X a; // X compatible with "unsigned int"
  unsigned int *p = &a;
}

但是如果你分配一个-1,那么GCC会选择使用int作为X兼容的类型

代码语言:javascript
复制
int main(void) {
  enum X { A = -1 };
  enum X a; // X compatible with "int"
  int *p = &a;
}

使用GCC的选项--short-enums,这使得它使用仍然适合所有值的最小类型。

代码语言:javascript
复制
int main() {
  enum X { A = 0 };
  enum X a; // X compatible with "unsigned char"
  unsigned char *p = &a;
}

在最新版本的GCC中,编译器标志已更改为-fshort-enums。在某些目标上,默认类型为unsigned int。您可以检查答案here

票数 36
EN

Stack Overflow用户

发布于 2009-07-11 14:49:16

C99,6.7.2.2p4说

每个枚举类型应与char、有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,108),但是应当能够表示枚举的所有成员的值。..。

脚注108增加了

实现可以延迟选择哪种整数类型,直到看到所有枚举常量为止。

所以它是由实现定义的,sizeof(枚举)可能等于sizeof(char),即1。

在选择某个小范围的整数时,总是要付出代价的。如果您在内存中将其设置为较小,则可能会产生处理损失;如果您将其设置为较大,则可能会导致空间损失。这是一个时间-空间-权衡。

错误代码通常是#定义的,因为它们需要可扩展:不同的库可能会添加新的错误代码。您不能使用枚举做到这一点。

票数 18
EN

Stack Overflow用户

发布于 2009-07-11 14:56:15

是大小Is (枚举) == sizeof(整型),总是

ANSI C标准规定:

每个枚举类型应与char、有符号整数类型或无符号整数类型兼容。类型的选择由实现定义。(6.7.2.2枚举说明符)

所以我会认为这意味着不。

如果是这种情况,#DEFINE会更好,因为它会节省内存。

与使用枚举相比,使用定义节省内存的方式是什么?枚举只是一种允许您向编译器提供更多信息的类型。在实际得到的可执行文件中,它只是被转换为一个整数,就像预处理器将使用#define创建的宏转换为它的值一样。

通常的做法是什么?如果我必须通过网络传输这些返回类型,并且必须在另一端进行一些处理

如果您计划通过网络传输值并在另一端处理它们,则应该定义一个协议。决定每种类型的字节大小(以位为单位)、字节顺序(字节顺序),并确保在客户端和服务器代码中遵守这一点。另外,不要因为它碰巧工作,就认为你做对了。例如,您选择的客户端和服务器平台上的字节顺序可能是匹配的,但情况可能并不总是如此。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1113855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档