在 C 中为内存定义枚举的数据类型



我找不到直接的答案,但是是否可以在C中为enum强制使用某种数据类型?

例如,我有一个状态机的enum,它只会保存一些状态,所以对于内存和性能问题,将enum定义为字节或更短的数据类型会很棒。有没有办法在C甚至Arduino IDE中提供这种行为?

任何帮助不胜感激

C 标准说枚举常量,即枚举的"成员",必须与类型int兼容。但是枚举变量本身允许是其他整数类型。如果你认为这没有任何意义,那是因为它没有意义:当涉及到枚举时,C 标准是不合理的。

至于如何选择枚举变量对应的整数类型,不幸的是,这是编译器而不是程序员的决定。在 8 位 Atmel 上,枚举变量为 8 位或 16 位。

一些编译器提供了一个选项,通过非标准编译器选项设置枚举的大小。无论如何,使用这些功能可能不是一个好主意,因为这会使代码不可移植。

但是,无论枚举的大小如何,编译器都可以(并且可能会)优化存在枚举的表达式,就像它可以优化任何包含小整数类型的表达式以不使用int进行计算一样,因为 C 标准通过整数提升来强制要求。

如果您有非常极端的性能要求,请不要使用枚举,而是uint8_t.但是,如果您有极高的性能要求,那么您首先就不会使用业余爱好者的8位MCU!所以事实证明,你的担忧不是问题。

继续使用枚举,让编译器担心优化。

如前所述,枚举常量基本上是整数常量。它们本身不占用空间,它们没有在可执行代码中的某个地方列出。

但是,如果使用枚举类型来定义变量,则该变量可能占用与 int 变量一样多的空间。如果需要保存此空间,可以使用任何其他能够存储必要范围的整数类型。例如,代替:

enum state {S1, S2, S3, S4};
enum state stack[1000];
...
stack[i] = S2;
... 

你可以写:

enum state {S1, S2, S3, S4};
typedef unsigned char my_state_type;
my_state_type stack[1000];
...
stack[i] = S2;
...

枚举不会"存储",因为变量使用内存位置。语句中使用枚举。这些语句被编译,在编译的结果(机器代码、汇编程序)中,枚举被替换为它们的值。例如,值为1的名为MY_ENUM1的枚举常量将在汇编程序中替换为

mov ax, 1

因此,它们将占用指令操作数所需的最小内存量。

在我看来,C 中枚举的主要价值是更具描述性的代码,可能更容易阅读和维护。与使用一堆 #define 语句相比,使用枚举似乎没有任何真正的好处。即使声明枚举颜色类型的变量,例如my_hue,编译器(至少 gcc)也不会显示错误,如果您将"无效"值(-100 或 +100)分配给my_hue。作为一个不希望的副作用,你让编译器选择在完全合理的循环中不起作用的变量类型。

最新更新