枚举参数功能和开关优化

时间:2011-06-20 08:10:03

标签: c++ c optimization

如何优化此类代码: 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;
    }
}

5 个答案:

答案 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实现的,但我猜您会找到所选语言的相应语法。