C ++中的Bitflag枚举

时间:2009-11-07 16:29:53

标签: c++ enums type-systems bitflags

使用枚举在C ++中存储bitflags有点麻烦,因为一旦枚举值被OR化,它们就会失去它们的枚举类型,这会导致错误,而无需显式转换。

this question的已接受答案表明|运算符超载:

FlagsSet operator|(FlagsSet a, FlagsSet b) 
{ 
    return FlagsSet(int(a) | int(b)); 
}

我想知道这种方法是否有任何运行时影响?

4 个答案:

答案 0 :(得分:5)

运行时对正确性的影响?不 - 这应该是你想要的。

运行时对速度的影响?我希望任何一个像样的编译器都能正确地优化这个版本到发布版本的最小指令数量(尽管你可能想要添加inline以确保)。

答案 1 :(得分:0)

它可能会执行三个副本和一个函数调用,禁止使用RVO,注册和/或内联优化。

Naked bitwise OR操作本身通常会分解为单个处理器指令。

答案 2 :(得分:0)

代码是正确的。

代码的速度与没有类型转换的速度相同。

但代码是否快速无关紧要,因为名为'FlagSet'的类型很可能会在条件测试的上下文中使用( - >“if(Flag)”),这更像是速度的打击比寄存器大小的两个值有点'或'。

答案 3 :(得分:0)

使用std :: bitset作为你的位标志...更简单;) 或者boost :: dynamic_bitset。