在D编译器中,“final switch
”构造在D中提供了超出普通switch
的额外优化可能性(如果有的话)吗? (DLang)
答案 0 :(得分:6)
简答:无。
答案很长:
final switch
优于switch
的主要优点是,当您使用枚举类型的值时,如果您错过了其中一个枚举成员,则会出现错误,因此您可以一定要把它们都盖好。如果枚举更改为包含更多成员或更少,您就会知道需要更新switch
声明。
除此之外,在语义上,final switch
与switch
语句几乎完全相同,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}并且,优化方面,switch
与default
语句类似,其中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的切换可以使用运行时初始化的案例值。