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

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

  • 还是它依赖于编译器?
  • 是否错误地说,编译器针对字长(内存对齐)进行了优化,即y int是特定编译器的字大小? 这是否意味着如果我使用枚举没有处理惩罚,因为它们是字对齐的?
  • 如果我把所有的返回码放在一个枚举中,不是更好,因为我显然不担心它的值,只检查返回类型时的名字。 如果是这种情况,#DEFINE会更好,因为它可以节省内存。
  • 通常的做法是什么? 如果我必须通过网络传输这些返回类型,并且必须在另一端执行某些处理,那么您希望枚举/#定义/常量整数。

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

    从答案 - 我在下面添加这一行,因为我需要澄清 -

    “所以它是实现定义的,并且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中的“某些整数类型”也可能包含扩展整数类型(但是,如果提供它们,实现必须记录文件)。 枚举的类型是可以存储任何枚举数(在这种情况下为AB )的值的某种类型。

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

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

    我只是使用一种可以存储枚举数值的类型(我应该知道大致的数值范围),投射到它并通过网络发送。 最好这个类型应该是一些固定宽度的类型,比如int32_t ,所以当涉及不同的机器时它不会发生冲突。 或者我会打印数字,并在另一边扫描它,这可以消除一些这些问题。


    对编辑的响应

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

    int main(void) {
      enum X { A = 0 };
      enum X a; // X compatible with "unsigned int"
      unsigned int *p = &a;
    }
    

    但是,如果你指定-1 ,那么GCC选择使用int作为X兼容的类型

    int main(void) {
      enum X { A = -1 };
      enum X a; // X compatible with "int"
      int *p = &a;
    }
    

    使用GCC选项--short-enums ,可以使用最小的类型来适应所有的值。

    int main() {
      enum X { A = 0 };
      enum X a; // X compatible with "unsigned char"
      unsigned char *p = &a;
    }
    

    C99,6.7.2.2p4说

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

    脚注108增加了

    一个实现可能会延迟选择哪个整数类型,直到看到所有枚举常量。

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

    在选择一些小范围的整数时,总会有一个惩罚。 如果你在内存中使它很小,可能会有处理惩罚; 如果你把它做得更大,会有空间的损失。 这是一个时间与空间的折衷。

    错误代码通常是#defines,因为它们需要是可扩展的:不同的库可能会添加新的错误代码。 你不能用enums来做到这一点。


    sizeof(enum)== sizeof(int),总是

    ANSI C标准说:

    每个枚举类型应与char,有符号整数类型或无符号整数类型兼容。 类型的选择是实现定义的。 (6.7.2.2枚举规范)

    所以我会认为不是。

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

    以什么方式使用enum来定义保存内存? 枚举只是一种允许您向编译器提供更多信息的类型。 在实际生成的可执行文件中,只是将其转换为整数,就像预处理器将使用#define创建的宏转换为其值。

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

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

    链接地址: http://www.djcxy.com/p/73583.html

    上一篇: Is the sizeof(enum) == sizeof(int), always?

    下一篇: What is the LD