![]() |
1
27
我不能谈论D或它的编译器,但我可以告诉你一些C++、Windows和VisualStudio编译器。这可能有助于你大致了解D是如何做事的。 首先,32位和64位机器上的异常处理是不同的。x86abi(prolog/epilog,unwinding,calling约定)更松散,因此编译器和程序本身必须做更多的工作。x86-64 ABI更为严格,操作系统发挥了更大的作用,使程序本身更容易处理异常。如果你在Windows上运行D,那么它很可能使用 SEH (结构化异常处理),如C++。 同样,下面的所有答案都涉及Windows、C++和VisualStudio。
x86:即使没有抛出异常,也要付出代价。异常处理信息被推送到TIB(线程信息块)中,比如初始作用域和特定于函数的异常处理程序。为了知道要销毁哪些对象以及要搜索哪些处理程序,需要维护一个scope变量。此范围变量将在您输入时更新
例外情况应该是例外 . 不要将其用于常规控制流。只能用它们来表示真正特殊的、意外的事件。基本上,您不必担心异常的代价。即使他们花了2秒钟,你也不应该在意,因为他们应该只发生在一切都南下的时候。
重点:
|
![]() |
2
6
在linux上,我相信它使用了GCC使用的异常表机制。在其他平台上,我不知道。 从性能方面来说,它可能与C++完全相同(或者至少非常接近)。 |
|
M.Jane · 组织和编写异常类的正确方法 6 年前 |
![]() |
shubham daharwal · java中的内部捕获异常 6 年前 |
![]() |
Jon · 如何在不需要任何操作的情况下处理Python异常 6 年前 |
![]() |
felix1415 · C++捕获(标准::异常和e)与捕获(…) 6 年前 |
![]() |
k0pernikus · 如何在scala中键入可能引发异常的函数? 6 年前 |