使用枚举时的高效 switch 语句

efficient switch statement when using enums

我有一个枚举和一个 switch 语句,使用了一些但不是全部的枚举条目,它们目前也有问题,即我有以下内容:

enum prot_tun_stat_e    {
    STAT_A = 0,     
    STAT_B,     
    STAT_C, 
    STAT_D,
    STAT_E,
    STAT_F, //5
    STAT_G,
    STAT_H,
    STAT_I,
    STAT_Y,
    STAT_K,     //10
    STAT_COUNT      //must be last
} __attribute__((packed));

然后我使用以下条目进行切换:

switch(var) {
case C:
break;
case D:
break
case F:
break
case G:
break
default
}

我想知道我是否更好地将枚举中的项目重新排列为 C=1,D=2,F=3&G=4 ?这样效率会更高吗?

谢谢, 罗恩

平台:PowerPC,编译器diab

我不能谈论 diab 编译器,因为我不熟悉它,但是优化编译器很可能会创建一个 跳转 table 表示 switch 语句覆盖 enum。所以顺序无关紧要。话虽如此,你不应该担心这种微不足道的事情。如果我误解了你的问题,请纠正我。

如果编译器可以确定 switch 语句的参数被限制为一个小数字,那么它可以创建一个 jump table。如果值是连续的,则此 table 将占用较少的空间,但 4 个条目或所需的 10 个条目之间的差异不太可能重要。 (注意 0-3 比 1-4 更好——尽管编译器可以通过跳转到偏移量 n - 1 来处理这个问题)。

您可以检查编译器的输出以查看是否正在创建跳转 table(假设您可以阅读汇编!)。当然还有所有性能问题的答案:剖析它!