2

在 C++ 中使用枚举来存储位标志有点麻烦,因为一旦枚举值被 ORed,它们就会失去它们的枚举类型,这会在没有显式转换的情况下导致错误。

这个问题的公认答案建议重载|运算符:

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

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

4

4 回答 4

5

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

运行时对速度的影响?我希望任何体面的编译器都能将其正确优化为发布版本的最少指令(尽管您可能想添加inline以确保)。

于 2009-11-07T16:34:50.010 回答
0

它可能会执行三个副本和一个函数调用,禁止 RVO、寄存器和/或内联优化。

裸按位或运算本身通常分解为单个处理器指令。

于 2009-11-07T16:35:21.117 回答
0

代码是正确的。

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

但是代码是否快速无关紧要,因为名为“FlagSet”的类型很可能会在条件测试(->“if(Flag)”)的上下文中使用,这更多的是对速度的影响而不是明智的选择寄存器大小的两个值的“或”。

于 2009-11-07T16:48:26.347 回答
0

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

于 2009-11-07T20:52:47.120 回答