首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >noexcept能提高性能吗?

noexcept能提高性能吗?
EN

Stack Overflow用户
提问于 2013-04-19 19:55:32
回答 1查看 9.1K关注 0票数 32

noexcept函数说明符是否旨在提高性能,因为生成的对象中可能没有异常的记账代码,因此应该尽可能将其添加到函数声明和定义中?我首先想到的是可调用对象的包装器,尽管检查表达式可能会使源代码“膨胀”,但noexcept可以起到一定的作用。这样做值得吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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保证(交换、移动和析构函数是常见的候选)。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16104057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档