在D编译器中,“final switch
”构造给出的其他优化可能性(如果有的话)是否超出D中的普通switch
? (DLang)D开关优化可能性(DLang)
回答
展望final switch
文档:http://dlang.org/spec/statement.html#FinalSwitchStatement它只是允许相同的优化与C switch
(它应该在代码中设置的标签,只是使用类似转到此基础上的变量值)。 D中的switch
比C中的switch
更一般,并且不允许这样的优化。从D开关可以使用运行时初始化大小写值。
简答:无。
龙答: 的final switch
超过switch
的主要优点是,当你有一个枚举类型的值使用它,它给你当你缺少枚举成员之一的错误,这样你就可以确保你有他们全部覆盖。如果枚举更改为拥有更多成员或更少成员,则您将知道需要更新switch
声明。
除此之外,在语义上,一个final switch
几乎是同样的事情作为switch
声明与具有assert(0)
一个default
情况 - 它只是它抛出一个SwitchError
而不是断言0
。但效果基本相同 - 当switch
语句被赋予一个没有被任何情况覆盖的值时,程序就会死亡。
我真的可以考虑使用final switch
以外的其他任何东西的唯一原因是,当case
语句应该涵盖所有可能的情况时,您不必编写default
的情况。考虑到至少在某些时候,你可以提供一个更有意义的信息,而不是一个SwitchError
给你(No appropriate switch clause found
),我倾向于认为明确的default
案例与assert(0)
并且在switch
语句不在枚举上运行时使用final switch
。
现在,关于您的优化问题,我认为final switch
不会提供任何比正常switch
优化的机会。当为final switch
给出的case
语句中未包含的值时,为了抛出SwitchError
,final switch
将不得不被降低到正常switch
语句,其中default
情况会抛出SwitchError
。
所以,在生成的代码方面,有一个真正的final switch
,并且具有抛出一个SwitchError
和优化明智的一个default
情况下,正常switch
没有区别,final switch
是类似的船到switch
语句断言0
(虽然assert(0)
一个default
情况下可能更容易导致不是抛出一个SwitchError
的优化,因为编译器可以假设,当一个断言明确false
程序会死,而程序可能捕获的Error
和继续,即使它不应该)。
我不知道编译器是否可以做任何优化的基础上,保证default
的情况下,如果它被击中程序将杀死该程序。如果可以的话,那么可以通过使用final switch
获得一些优化,但是具有default
情况的常规switch
断言0
或抛出Error
将与final switch
在同一条船上。所以,在这方面没有什么神奇的final switch
。 final switch
的魔力在于通过枚举来捕捉错误。
真的,我建议你只使用final switch
当你处理一个固定值的枚举类型,这样你就可以捕捉到案件不符合枚举成员,除此之外,你只是不要使用final switch
。老实说,我很惊讶地发现final switch
接受除枚举之外的任何东西。
SwitchError不会在释放模式下抛出(这里是关于它的讨论:https://issues.dlang.org/show_bug.cgi?id=11051)。如果没有检查,一些优化是可能的,例如参见https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49054和https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51513 – jpf
- 1. 关于cuda性能优化
- 2. d/DLang/GDC - 在结构
- 3. 优化性能
- 4. c#的性能和可能的优化
- 5. for循环/开关语句的性能优化
- 6. 优化Mgento性能
- 7. RegEx性能优化
- 8. 优化iFrame性能
- 9. Haskell性能优化
- 10. OpenCL性能优化
- 11. 性能优化 - Postgres
- 12. 优化Ext.tree.TreePanel性能
- 13. HttpListener性能优化
- 14. Solr性能优化
- 15. rsyslog性能优化
- 16. grails性能优化
- 17. 优化Actionscript性能
- 18. PHP优化性能
- 19. 优化docx4j性能
- 20. TCPDF优化性能
- 21. Nodejs性能优化
- 22. 如何优化开关盒?
- 23. 优化嵌套开关盒
- 24. 是否有可能在d/dlang中使用AliasSeq的模板类方法?
- 25. 优化C++ 2-d阵列
- 26. 数据可视化的性能和开发可能性
- 27. |性能调整和优化
- 28. PowerShell脚本性能优化
- 29. Java循环性能优化
- 30. QEMU-KVM性能优化
我应该正确地解释自己,我并不是故意将D与C进行比较,虽然这是一个很好的观点,我的意思是在代码生成方面比较D'final switch和switch语句的优化可能性。 (原来的帖子后来编辑澄清) –
我刚刚把D中的'final switch'和'switch'与C中的'switch'进行了比较。D中的'switch'可以使用运行时初始化的case值,所以我认为它不能实现通过标签/转到。 –
我相信GDC足够智能,可以发现当“switch”的D代码恰好不比C更普遍时所有可能的优化。例如,当存在大量密集常量可能性时,它会生成跳转表。但是 –