在 C++ 中使用枚举来存储位标志有点麻烦,因为一旦枚举值被 ORed,它们就会失去它们的枚举类型,这会在没有显式转换的情况下导致错误。
这个问题的公认答案建议重载|
运算符:
FlagsSet operator|(FlagsSet a, FlagsSet b)
{
return FlagsSet(int(a) | int(b));
}
我想知道这个方法是否有任何运行时影响?
在 C++ 中使用枚举来存储位标志有点麻烦,因为一旦枚举值被 ORed,它们就会失去它们的枚举类型,这会在没有显式转换的情况下导致错误。
这个问题的公认答案建议重载|
运算符:
FlagsSet operator|(FlagsSet a, FlagsSet b)
{
return FlagsSet(int(a) | int(b));
}
我想知道这个方法是否有任何运行时影响?
运行时对正确性的影响?不 - 这应该正是您想要的。
运行时对速度的影响?我希望任何体面的编译器都能将其正确优化为发布版本的最少指令(尽管您可能想添加inline
以确保)。
它可能会执行三个副本和一个函数调用,禁止 RVO、寄存器和/或内联优化。
裸按位或运算本身通常分解为单个处理器指令。
代码是正确的。
代码将与没有类型转换的速度相同。
但是代码是否快速无关紧要,因为名为“FlagSet”的类型很可能会在条件测试(->“if(Flag)”)的上下文中使用,这更多的是对速度的影响而不是明智的选择寄存器大小的两个值的“或”。
使用 std::bitset 作为您的位标志...更简单;) 或 boost::dynamic_bitset。