D开关优化可能性(DLang)

Cec*_*ard 1 d switch-statement compiler-optimization

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

Jon*_*vis 6

简答:没有.

龙答: 的主要优点final switchswitch是,当你有一个枚举类型的值使用它,它给你当你缺少枚举成员之一的错误,所以你可以肯定的是,你把它们都覆盖.如果枚举更改为拥有更多成员或更少,您就会知道需要更新switch语句.

除此之外,在语义上,a 与具有案例final switchswitch语句default几乎完全相同assert(0)- 只是它抛出SwitchError而不是断言0.但效果基本相同 - 当switch语句被赋予任何情况未涵盖的值时,您的程序就会死亡.

我真正想到使用final switch枚举以外的任何东西的唯一原因是,defaultcase语句应涵盖所有可能的情况时,您不必编写案例.并且考虑到至少在某些时候,你可以提供一个更有意义的消息与断言而不是SwitchError给你(No appropriate switch clause found),我倾向于认为最好有一个明确的default情况与一个assert(0)和一个消息比final switchswitch语句不在枚举上运行时使用a .

现在,关于优化的问题,我认为没有任何机会可以final switch提供优于正常的优化switch.为了SwitchErrorfinal switch给出一个未被任何case语句覆盖的值时抛出一个值,final switch必须将其降低到一个正常的switch语句,并default抛出一个案例SwitchError.

因此,就结果代码而言,a final switch和普通之间确实没有区别,其中switch一个default案例抛出a SwitchError,并且在优化方面,final switch与一个switch声明具有default断言的情况相似0(尽管assert(0)可能更有可能)导致优化而不是抛出a SwitchError,因为编译器可以假设程序将在显式断言时死亡false,而程序可以捕获Error并继续,即使它不应该).

我不知道编译器是否可以进行任何优化,基于保证default如果它被击中的情况下将杀死该程序.如果它可以,那么可能会有一些优化可以通过使用获得final switch,但是一个定期switchdefault案例断言0或扔一个Error将在同一船上final switch.所以,final switch在这方面没有什么神奇之处.神奇的final switch是用枚举来捕捉错误.

真的,我建议您只final switch在处理具有固定值集的枚举类型时使用,以便在案例与枚举成员不匹配时捕获,除此之外,您只需要'使用final switch.老实说,我很惊讶地发现final switch除了枚举之外还接受了其他任何东西.