使用枚举时的高效 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(假设您可以阅读汇编!)。当然还有所有性能问题的答案:剖析它!
我有一个枚举和一个 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(假设您可以阅读汇编!)。当然还有所有性能问题的答案:剖析它!