【发布时间】:2012-02-20 20:14:22
【问题描述】:
在使用 VC++ 2008 和 2010 时,使用哪个标记更好地指示函数不会引发异常:
-
throw()(C++ 标准) -
__declspec(nothrow)(MS 扩展)
我阅读了一些较早的论坛讨论,其中人们说使用throw() 实际上可能会强制编译器生成额外的代码来捕获异常,以防函数抛出(针对标记)。他们的建议是不要使用throw(),而是使用__declspec(nothrow),因为编译器实际上可以使用它进行优化。
我进行了一些搜索,但找不到真正有用的结果。据我了解,Boost 库建议不要使用它们here。 __declspec(nothrow) 是非标准 C++,因此如果 MS 实现异常规范,它会继续以相同的方式工作,而 throw() 的行为可能会发生变化。
【问题讨论】:
-
异常规范在 c++ 中不是很有用:gotw.ca/publications/mill22.htm
-
@CodyGray 谢谢,我正在搜索 nothrow 和 __declspec,但找不到太多这样的方法。
-
CodyGray:请注意,所有这些问题现在都采用了新标准,这大大改变了允许的优化。
-
相关:Why add a throw() to your methods?。这篇博文中的 cmets 也值得一读。
标签: visual-c++ exception throw declspec