编译器是否允许优化掉依赖于未声明值的枚举的分支?

5

或者说,编译器可以假设一个enum实例只能持有其声明的值,并基于该假设进行优化吗?

enum MyType { A = 1, B = 2 };

const MyType C = static_cast<MyType>(3);

void fun(MyType m) {
    switch (m) {
        case A:
            // ...
            break;
        case B:
            // ...
            break;
        case C:
            // can this be optimized away?
    }
}

4
由于在MyType列表中未包含此情况,因此出现了case value ‘3’ not in enumerated type 'MyType'的警告。至少g++会发出警告。请注意,我已经尽力使翻译准确、简明扼要且易于理解,但不能更改原意。 - Ryan Haining
@RyanHaining 如果你执行 const MyType C = static_cast<MyType>(value),那么这肯定是你最不用担心的问题吧?比如更新你的简历,并向法院申请更名,这样你的同事们就无法因为名字而在未来阻止你成为一名程序员了? - kfsone
2
你想做什么?如果你担心这个问题,为什么不将 m 强制转换为 int 呢?在这种特殊情况下,你已经破坏了 m 的数据类型,这似乎是合理的。至少在这种简单的情况下,你也可以使用 if。我知道这并没有完全回答你的问题。只是在这种情况下,对于编译器会优化掉什么存在疑虑,似乎不太好,而绕过会带来歧义的语法则更好。 - Mobile Ben
1
void fun(int m) { return m>2? doTheStuffFor(m): fun(static_cast<MyType>(m)); } 并替换所有可能出现问题的调用。您还可以尝试使用MyExtendedType。 - lorro
3
这段代码完全有效。枚举类型可以容纳适合于枚举值所需位数的任何值。这使得您可以将枚举类型用作位字段,在语言定义中是一个有意的决定,并兼容多年的C语言使用。 - Pete Becker
显示剩余4条评论
1个回答

4
编译器无法优化未声明的枚举值。关于枚举器的语言规范部分说明:

可以定义一个枚举,它的值没有被任何枚举器定义。

因此,枚举允许具有在枚举声明中未明确指定的值。

此外,在位掩码类型的部分中提供了利用未定义枚举值的示例,特别是将0作为有效标志值。

由于允许使用未声明的枚举值,编译器无法优化使用它们的代码。


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - GManNickG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接