在 D 编译器中,“final switch
”构造在 D 中的普通 switch
之上提供了哪些额外的优化可能性(如果有的话)? (DLang)
最佳答案
简答:无。
长答案:
初级优势final switch
在 switch
是当您将它与枚举类型的值一起使用时,当您缺少其中一个枚举成员时,它会给您一个错误,因此您可以确保涵盖了所有成员。如果枚举发生变化,成员增多或减少,您就会知道需要更新 switch
。声明。
除此之外,在语义上,一个 final switch
与 switch
几乎相同带有 default
的语句有 assert(0)
的情况- 只是它抛出一个 SwitchError
而不是断言 0
.效果本质上是一样的——你的程序在 switch
时终止。语句被赋予一个值,该值未包含在任何情况下。
我真正想到使用 final switch
的唯一原因使用枚举以外的任何东西,这样您就不必编写 default
case
时的情况陈述应该涵盖所有可能的情况。考虑到至少在某些时候,您可以通过断言提供比 SwitchError
更有意义的消息。给你( No appropriate switch clause found
),我倾向于争辩说最好有一个明确的 default
带assert(0)
的箱子和消息而不是使用 final switch
当switch
语句不对枚举进行操作。
现在,关于您关于优化的问题,我认为 final switch
没有任何机会提供对正常 switch
的任何优化.为了抛出 SwitchError
当final 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
获得一些优化。 , 但一个普通的 switch
用default
断言 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/