如何优化此类代码: ENUM_ELEM是枚举的元素,我想避免这样的开关
short int f(short int b){
switch(b){
case ENUM_ELEM1 : return -12;
case ENUM_ELEM2 : return 0;
case ENUM_ELEM3 : return 12;
}
}
答案 0 :(得分:2)
如果ENUM_ELEM#
处于较低范围内,则可以使用表,并使用枚举值作为表的索引来获取返回值。
但我可以想象一些智能编译器可以通过这种方式优化代码...
不要忘记优化的三个规则:衡量,衡量,衡量。
答案 1 :(得分:1)
有两种选择:
如果你的枚举值是连续的默认值(即:0,1,2) - 制作一个表格:
int translate[ENUM_ELEM3] = {-12,0,12};
return translate[ENUM_VALUE];
或者,#define
他们为-12,0,12,无论如何都传递了short int
,而不是enum
。
IIRC新标准(c ++ 0x)允许enum
值为负,检查您的编译器是否支持它,那么您根本不会遇到任何问题。
答案 2 :(得分:0)
如果您的枚举是紧凑的,请使用查找表
答案 3 :(得分:0)
如果这是关于代码质量/可维护性w.r.t. OOP,您可能希望研究重构“用多态性替换条件”。
在性能优化的情况下(在验证应用程序的真正的瓶颈之前你不应该关心它,而且你也不应该过早关心它们),你可以使用一个好的旧查找表,只需将它放在那里就像是 0 ,或者(再次)让它在那里就像是因为你的CPU不到15岁 1 < / p>
0 编译器已经优化了许多switch语句(但你可能想看看你的编译器实际为你做了什么)
1 推测执行,分支预测和你的分支目标缓冲区可能比你和编译器更好
答案 4 :(得分:0)
如果ENUM_ELEM1的值为负,则ENUM_ELEM2的值为零,ENUM_ELEM3的值为正。
然后您可能希望通过以下方式 refuctor 实现可读性:
static final short unPos = (short)(1 << 15);
static short f(short b)
{
return (short)(b == 0 ? 0 : (b &= unPos) == unPos ? -12 : 12);
}
请注意我是用Java实现的,但我猜您会找到所选语言的相应语法。