【问题标题】:How does Enum allocate Memory on C?Enum 如何在 C 上分配内存?
【发布时间】:2012-09-04 15:41:47
【问题描述】:

我正在尝试使用 C 和汇编 (intelx8086) 语言。

我也在使用一个由我的朋友实现的类。它有一个

typedef enum data_10 {a=0,b=7,c=10,} data_10_type;

我想按位使用这个类(AKA 在组装时构造它/销毁它)。我的问题是,“枚举”需要多少内存?

【问题讨论】:

  • 在 C 中,与 int 相同。在 C++0x 中,它可以或多或少基于基类型。
  • Wikipedia 有一些与您的任务相关的信息。
  • C 没有类,至少不是一流的语言特性。也许您的意思是一个具有 data_10_type 类型成员的结构?

标签: c assembly enums abi


【解决方案1】:

虽然它可能因编译器而异,但enum 通常与int 具有相同的大小。不过可以肯定的是,您始终可以使用sizeof( data_10_type );

【讨论】:

  • 这将告诉您一种架构上的一种编译器的一个特定版本的大小。这不是面向未来的。
  • @NovaDenizen 仅当您将其打印一次并永久使用时。最好将它存储在一个变量中并使用它来进行分配。
  • @Greyson 所以 OP 是用汇编语言编写的,但是在对这些结构的每一次引用中,他确实根据这个变量处理算术?对我来说,OP 似乎更有可能确切地知道结构中字段的字节布局,但是在单个版本的编译器的上下文之外不存在此信息。
【解决方案2】:

为什么不打印出来?

/* C99 */
#include <stdio.h>

typedef enum { a = 0, b = 7, c = 10 } data_10_type;
printf("%zu\n", sizeof(data_10_type));

枚举器列表中的标识符被声明为具有int 类型的常量(C11 §6.7.2.2 枚举说明符),因此sizeof(data_10_type) 通常等于sizeof(int),但它没必要!

顺便说一句,如果您想以位为单位,只需使用CHAR_BIT 常量(在&lt;limits.h&gt; 中定义),它表示单个字节中有多少位)。

/* C99 */
#include <limits.h>
#include <stdio.h>

typedef enum { a = 0, b = 7, c = 10 } data_10_type;
printf("%zu\n", sizeof(data_10_type) * CHAR_BIT);

【讨论】:

  • CHAR_BIT在哪些情况下不同于8?
  • 标准规定CHAR_BIT大于8。例如,在DSP上,CHAR_BIT通常等于16。
  • @Dirk:不能保证 CHAR_BIT 为 8。从历史上看,字节是 6、7 和 8 位。现代嵌入式系统可能具有不同大小的字符(例如 16 位)。我们也不知道 10 多年后的架构会是什么样子,所以最好不要假设(或至少使用静态断言来安全地失败)。
  • CHAR_BIT 必须至少 8;它可以更大,但不能更小(5.2.4.2.1,“实现定义的值应等于或大于所示的值(绝对值),具有相同的符号”)。
【解决方案3】:

枚举根本不占用任何内存;它被编译器理解,并且在编译过程中使用了正确的数字。它是一个 int,其大小取决于您的系统。

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 2011-09-14
    • 2019-01-17
    • 2015-12-24
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多