枚举如何在C上分配内存?

枚举如何在C上分配内存?,c,assembly,enums,abi,C,Assembly,Enums,Abi,我正在尝试使用C语言和汇编语言(intelx8086) 我还使用了一个由我的一个朋友实现的类。它有一个 typedef enum data_10 {a=0,b=7,c=10,} data_10_type; 我想按位使用这个类(也就是在程序集上构造/销毁它)。我的问题是,“枚举”占用多少内存?一个枚举实际上根本不占用任何内存;编译器理解它,并且在编译过程中使用正确的数字。它是一个int,其大小取决于您的系统。为什么不打印它 /* C99 */ #include <stdio.h>

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

我还使用了一个由我的一个朋友实现的类。它有一个

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

我想按位使用这个类(也就是在程序集上构造/销毁它)。我的问题是,“枚举”占用多少内存?

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

为什么不打印它

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

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

尽管它可能因编译器而异,
enum
通常采用与
int
相同的大小。当然,您可以始终使用
sizeof(数据类型)

,与
int
相同。在C++0x中,它可以或多或少地基于基类型。的可能副本包含一些与您的任务相关的信息。C没有类,至少不是一流的语言功能。可能您指的是具有该
数据\u 10\u类型
成员的结构?在哪些情况下字符位与8不同?标准规定
字符位
大于8。例如,在DSP上,
CHAR\u位通常等于16。@Dirk:不能保证CHAR\u位为8。历史上,字节是6、7和8位。现代嵌入式系统可能具有不同大小的字符(例如,16位)。我们也不知道10年后的架构会是什么样子,所以最好不要假设(或者至少使用静态断言来安全地失败)。
CHAR\u BIT
必须至少为8;它可以更大,但不能更小(5.2.4.2.1,“实现定义值的大小(绝对值)应等于或大于所示值,带相同符号”)。这将告诉您一个体系结构上一个编译器的一个特定版本的大小。它不是未来的证明。@NovaDenizen,只有当你打印一次并永远使用它的时候。最好将其存储在一个变量中,并使用该变量进行分配。@Greyson所以OP是在汇编中编写的,但在对这些结构的每次引用中,他都会处理基于此变量的算术?在我看来,OP更可能想确切地知道结构中字段的字节布局,但这些信息不存在于单一版本编译器的上下文之外。
/* 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);