根据优化C ++,
对于您确定永远不会抛出异常的函数,请使用空异常规范(即在声明中添加throw())。
如果我知道90%的方法不会引发异常怎么办? 为所有这些方法附加throw()似乎是不常规且啰嗦的。 如果没有,有什么优点吗? 或者我理解错了什么?
对于您确定永远不会抛出异常的函数,请使用空异常规范(即在声明中添加throw())。
如果我知道90%的方法不会引发异常怎么办? 为所有这些方法附加throw()似乎是不常规且啰嗦的。 如果没有,有什么优点吗? 或者我理解错了什么?
noexcept
,throw
有点过时(根据this效率较低)。
noexcept
是throw()
的改进版,在C++11中throw()
已经过时。与throw()
不同,noexcept
不会调用std::unexpected
,可能会或可能不会解开堆栈,这潜在地允许编译器在没有throw()
运行时开销的情况下实现noexcept
。
当违反空抛出规范时,程序将终止;这意味着只有在函数具有无抛出异常保证时才声明函数为非抛出异常。
最后,您需要一个移动构造函数来使其非抛出异常(使用noexcept
指定),以便能够使用std::vector<T>::push_back
的r-value ref版本(请参见更好的说明here)。
throw()
不会增强可优化性。throw()
,那么编译器会强制检查方法是否抛出异常并展开堆栈——就像没有标记为 throw()
的函数一样。唯一的区别在于,对于标记为 throw()
的函数,当异常离开函数时,全局的 unexpected_handler
会被调用(通常会调用 terminate()
),将堆栈展开到该级别,而不是处理异常的普通函数的行为中,在没有异常说明的情况下正常处理异常。throw()
的处理方式是非标准的。 throw()
等同于 __declspec(nothrow)
,它允许编译器假定函数不会抛出异常,如果抛出异常则会导致未定义的行为。noexcept
关键字。Bjarne Stroustup 的 C++11 FAQ 对此有以下解释:noexcept
的函数抛出异常,则编译器不必完全展开堆栈。这提供了一些优化可能性。Scott Meyers在他即将出版的书“Effective Modern C ++”中讨论了新的noexcept
。
nothrow
会在编译时检测到可能的违规吗?(只是为了确保100%) - πάντα ῥεῖ