【问题标题】:noexcept specifier and compiler optimizationsnoexcept 说明符和编译器优化
【发布时间】:2013-03-05 15:52:14
【问题描述】:

我已经阅读了关于 noexcept 说明符和编译器优化的不清楚的内容。当指定noexcept 时,编译器可能会优化:

  • 编译时间(编译速度更快)。
  • 执行时间(代码运行速度更快)。
  • 或两者兼而有之?
  • 还是没有?

【问题讨论】:

  • 编译器不会优化任何基于noexcept的东西。只有您的 代码 可以通过强制编译器根据 noexcept 是否可用来在不同的函数之间进行选择来优化事物。
  • @NicolBolas 我知道使用 noexcept 的目的不是为了优化。但是环顾四周,我在这个领域发现了不同的答案(like this one),我仍然不清楚编译器究竟可以(或应该)优化什么,或者即使现在说还为时过早。

标签: c++ c++11 compiler-optimization noexcept


【解决方案1】:

noexpect 的最初原因是让库能够在内部使用更快的移动构造函数,如果调用函数不允许按规范抛出。

接下来,当您的类型的移动构造函数和移动赋值使用 noexcept 注释时,可以在 STL 矢量等容器中实现大幅性能优化。当 STL 实用程序 std::move_if_noexcept 检测到您的动作没有抛出时,它将使用这些安全动作而不是副本进行某些操作(如调整大小)。在容器存储数百万个元素的情况下,这将实现巨大的优化。

(引自using-noexcept


此外,如果编译器知道由于 noexpect 说明符而不会引发异常,则编译器不必为堆栈展开生成额外代码。


我看不出 noexcept 说明符如何显着影响编译时间。不过,生成的运行时可能会快很多。

【讨论】:

    猜你喜欢
    • 2016-02-13
    • 1970-01-01
    • 2018-10-20
    • 2023-03-20
    • 2020-05-08
    • 2015-06-28
    • 2014-01-17
    • 1970-01-01
    • 2011-05-06
    相关资源
    最近更新 更多