noexcept
函数说明符是否旨在提高性能,因为生成的对象中可能没有异常的记账代码,因此应该尽可能将其添加到函数声明和定义中?我首先想到的是可调用对象的包装器,尽管检查表达式可能会使源代码“膨胀”,但noexcept
可以起到一定的作用。这样做值得吗?
发布于 2013-04-19 20:45:56
顶级编译器生成已经优化的代码,就像不能抛出的代码一样,然后异常发生时的情况由异常处理机制通过查看与函数相关的元数据找到的行外代码来处理。不过,我认为在已知不需要它的情况下,省略它在代码大小上有一些好处。
可能在某些情况下,nothrow规范确实允许某些特定的优化:
int main() {
int i = 0;
try {
++i;
thing_that_cannot_throw();
++i;
thing_that_can_throw();
++i;
} catch (...) {}
std::cout << i << "\n";
}
在这里,第二个++i在理论上可以在调用thing_that_cannot_throw
之前重新排序( i
只是初始化为2
)。然而,它是否在实践中是另一回事,因为在调试器或函数调用之上的堆栈中保证变量状态的实现会希望i
在调用期间具有值1
,即使它是任何标准方法都无法观察到的局部变量。
我怀疑nothrow保证对程序员比对编译器更有价值。如果你正在编写提供强异常保证的代码,那么通常你会执行某些关键操作,你需要提供nothrow保证(交换、移动和析构函数是常见的候选)。
https://stackoverflow.com/questions/16104057
复制相似问题