小编das*_*t99的帖子

可以针对枚举优化 switch 默认语句吗

如果我有一个显式处理所有枚举情况的 switch 语句,是否允许编译器优化默认的 case 语句?

enum MyEnum {
 ZERO = 0,
 ONE = 1,
 TWO = 2,
 THREE = 3,
};

bool foo(MyEnum e) {
 switch(e) {
 case ZERO:
 case ONE:
 case TWO:
 case THREE:
  return true;
 default:    // Could a compiler optimise this away?
  return false;
 }
}
Run Code Online (Sandbox Code Playgroud)

Cpp Reference说关于枚举(强调我的):

整数、浮点和枚举类型的值可以通过 static_cast 或显式强制转换转换为任何枚举类型。如果基础类型不固定且源值超出范围,则行为未定义。(如果源值转换为枚举的基础类型(如果是浮点型),则如果它适合足够大以容纳目标枚举的所有枚举器的最小位字段,则该源值在范围内。)否则,结果与隐式转换为基础类型的结果。

请注意,此类转换后的值不一定等于为枚举定义的任何命名枚举器。

这表明可以优化上面示例中的默认语句,因为基础类型不固定并且指定了每个 2 位值(尽管您可能需要包含负值到 -4)。

但是,尚不清楚这是否也适用于固定类型枚举或枚举类。


实际上,GCC、clang 和 MSVC 并不假定枚举是定义的值之一。(Godbolt启用了全面优化,例如-O3 -std=c++20。)

这是错过的优化,还是标准说如果实现选择int作为基础类型(即使您没有指定)那么任何int值都是合法的?

CppReference …

c++ enums compiler-optimization language-lawyer c++20

9
推荐指数
1
解决办法
351
查看次数