throw()(即__declspec(nothrow))是否在Visual C++中带来了实实在在的好处?

13 c++ exception visual-c++

专注于Visual C++,您是否曾经使用throw()(即__declspec(nothrow))非投掷规范在C++代码中获得显着的性能提升?它真的有助于优化器吗?是否有任何基准显示性能提升?

我在互联网上找到了不同的(相反的)建议:

提升异常规范的理由反对的 throw(),而Larry Osterman似乎在他的博客文章中赞成它:为什么在你的方法中添加throw()?

(我想澄清一下我对VC++特定代码感兴趣 ;我知道在GCC中,throw()由于运行时检查,规范实际上可能是"悲观化".)

PS读取ATL标题,我发现它throw()是普遍使用的; 此外,我unique_handle这篇MSDN文章中找到了一个方便的C++ RAII 类,也使用了throw()规范.

jal*_*alf 4

MSVC 编译器将其视为优化提示,是的。

Boost 必须是跨平台的,他们必须寻求在各种编译器上安全且高效的东西。正如 boost 文档所说,某些编译器在throw()指定时可能会生成较慢的代码,并且在许多情况下,编译器可以推断出无论是否有throw()规范都不会抛出异常,因此对于 Boost,最安全的方法是永远不要使用投掷规格。

但是,如果您专门针对 MSVC,则throw()可以有效地告诉编译器不要为该函数生成异常处理代码,这可能会在函数过于复杂而编译器无法确定不会引发异常的情况下加快速度。