D开关优化可能性(DLang)

时间:2016-08-24 23:18:53

标签: switch-statement d compiler-optimization

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

2 个答案:

答案 0 :(得分:6)

简答:无。

答案很长: final switch优于switch的主要优点是,当您使用枚举类型的值时,如果您错过了其中一个枚举成员,则会出现错误,因此您可以一定要把它们都盖好。如果枚举更改为包含更多成员或更少,您就会知道需要更新switch声明。

除此之外,在语义上,final switchswitch语句几乎完全相同,default语句具有assert(0) - 它是&#39}只是它抛出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案例抛出{{1}并且,优化方面,switchdefault语句类似,其中0语句断言assert(0)(尽管SwitchError可能是false更有可能导致优化而不是抛出Error,因为编译器可以假设程序将在断言明确default时死亡,而程序可以捕获final switch并继续,即使它不应该。

我不知道编译器是否可以根据switch案例如果它被击中就会杀死程序的保证做任何优化。如果可以,那么可以使用default进行一些优化,但是常规0具有Error案例,该案例断言final switch或者投掷final switch 1}}将与final switch在同一条船上。所以,在这方面final switch并不神奇。 final switch的神奇之处在于用枚举来捕捉错误。

实际上,我建议您在处理具有固定值集的枚举类型时仅使用final switch,这样您就可以在案例不适用时抓住匹配枚举成员,除此之外,你只是不使用templateUrl。老实说,我很惊讶地发现template接受了除枚举之外的其他任何内容。

答案 1 :(得分:1)

期待final switch文档:http://dlang.org/spec/statement.html#FinalSwitchStatement它只允许在C中使用与switch相同的优化(它应该在代码中设置标签,并且只使用基于变量值的goto之类的内容)。 D中的switch比C中的switch更通用,并且不允许这样的优化。 D的切换可以使用运行时初始化的案例值。