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

时间:2016-12-01 09:20:47

标签: c enums arduino state-machine

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

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

感谢任何帮助

3 个答案:

答案 0 :(得分:4)

C标准说枚举常量,即"成员"枚举,必须与类型int兼容。但是枚举变量本身可以是其他整数类型。如果您认为这没有任何意义,那是因为它并不是:C标准在枚举方面是不合理的。

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

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

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

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

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

答案 1 :(得分:3)

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

但是,如果使用枚举类型来定义变量,则变量可能占用与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;
...

答案 2 :(得分:1)

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

    mov ax, 1

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