switch-statement - D 开关优化可能性 (DLang)

标签 switch-statement d compiler-optimization

在 D 编译器中,“final switch”构造在 D 中的普通 switch 之上提供了哪些额外的优化可能性(如果有的话)? (DLang)

最佳答案

简答:无。

长答案: 初级优势final switchswitch是当您将它与枚举类型的值一起使用时,当您缺少其中一个枚举成员时,它会给您一个错误,因此您可以确保涵盖了所有成员。如果枚举发生变化,成员增多或减少,您就会知道需要更新 switch。声明。

除此之外,在语义上,一个 final switchswitch 几乎相同带有 default 的语句有 assert(0) 的情况- 只是它抛出一个 SwitchError而不是断言 0 .效果本质上是一样的——你的程序在 switch 时终止。语句被赋予一个值,该值未包含在任何情况下。

我真正想到使用 final switch 的唯一原因使用枚举以外的任何东西,这样您就不必编写 default case 时的情况陈述应该涵盖所有可能的情况。考虑到至少在某些时候,您可以通过断言提供比 SwitchError 更有意义的消息。给你( No appropriate switch clause found ),我倾向于争辩说最好有一个明确的 defaultassert(0) 的箱子和消息而不是使用 final switchswitch语句不对枚举进行操作。

现在,关于您关于优化的问题,我认为 final switch 没有任何机会提供对正常 switch 的任何优化.为了抛出 SwitchErrorfinal switch被赋予的值未包含在任何 case 中报表,final switch必须降低到正常 switch带有 default 的语句抛出 SwitchError 的情况.

因此,就生成的代码而言,final switch 之间确实没有区别。和正常的 switch有一个 default抛出 SwitchError 的情况,和优化方面,final switch在与switch 类似的船上带有 default 的语句断言 0 的案例(尽管 assert(0) 可能比抛出 SwitchError 更可能导致优化,因为编译器可以假设程序将在显式声明为 false 时终止,而程序可以 捕获 Error 并继续,即使它不应该)。

我不知道编译器是否可以根据 default 的保证进行任何优化。如果它被击中, case 将终止程序。如果可以,那么可以通过使用 final switch 获得一些优化。 , 但一个普通的 switchdefault断言 0 的案例或者扔一个Error将与final switch在同一条船上.所以,final switch 并没有什么神奇之处在这方面。 final switch的魔力正在用枚举捕捉错误。

真的,我建议你只使用 final switch当您处理具有一组固定值的枚举类型时,您可以在案例与枚举成员不匹配时捕捉到,除此之外,您只是不使用 final switch .老实说,我很惊讶地发现 final switch接受枚举以外的任何东西。

关于switch-statement - D 开关优化可能性 (DLang),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39134416/

相关文章:

c# - 为什么我需要使用 break?

linux - 如何创建彩色文本?

c++ - 为什么 Clang 分配 std::complex 这么快?

svn - SVN 的 relocate 是将代码与两个颠覆存储库同步的安全选项吗?

java - 在 switch 语句退出选项中尝试 catch

c++ - 为什么我不能在 switch-case 语句中有一个变量?

d - 如何删除关联数组中最近最少访问的键?

templates - DMD 拒绝实例化模板 : not a template declaration

c++ - 如果另一个指针指向它的引用,为什么 const int 不会被编译器(通过符号表)优化?

c - 当 -mavx2 打开时为 __builtin_popcount 生成臃肿的代码