【发布时间】:2012-05-20 12:46:05
【问题描述】:
专注于 Visual C++,您是否曾在使用 throw()(即 __declspec(nothrow))非抛出规范的 C++ 代码中体验过显着的性能提升?
它真的对优化器有帮助吗?
是否有任何基准显示性能提升?
我在网上找到了不同的(相反的)建议:
Boost exception-specification rationale反对throw(),相反,Larry Osterman 在他的博文中似乎赞成:Why add a throw() to your methods?
(我想澄清一下,我对 VC++ 特定代码感兴趣;我知道在 GCC 中,由于运行时检查,throw() 规范实际上可能是“悲观化” .)
P.S. 阅读ATL标头,发现throw()被普遍使用;此外,我在this MSDN article 中找到了一个方便的C++ RAII unique_handle 类,它也使用throw() 规范。
【问题讨论】:
-
这真的与你自己的设计有关,如果你的函数有理由抛出一些东西,那么就这样做,只要记住异常是针对特殊情况,而不是错误。就使用异常的运行时间而言,大部分争论是关于异常传播到处理程序所需的时间,以及对异常进行的额外运行时间检查。唉,如果你写的东西对性能非常重要,你可能会考虑根本不使用异常。但是对于大多数非关键代码,异常使用是可以的。这只是我的两分钱。
-
这是相当主观的。但是你给出的例子是相反的,Boost 担心异常规范只是不能很好地工作。 C++11 委员会同意并弃用它们。 Larry 正在谈论编译器可以利用它们生成更优化代码的方式,这是一个完全不同的角度。可以工作,但我厌倦了优化器智取我提供一个例子。由于 64 位代码使用函数表,因此优化非常轻微并且变得非常无关紧要。
-
不要考虑微观性能,要考虑清晰度。
-
他的问题是关于性能,而不是什么是好的设计。我也很想知道这方面的答案!
-
@Cheersandhth.-Alf:如果您编写的组件在应用程序中使用了很多时间,那么小的优化可能会增加一些重要的东西。我发现
throw()在 ATL 标头中普遍使用,它也用于unique_handle类 in this MSDN article。
标签: c++ visual-c++ exception