C++ noexcept说明符和编译器优化

C++ noexcept说明符和编译器优化,c++,c++11,compiler-optimization,noexcept,C++,C++11,Compiler Optimization,Noexcept,我读过一些关于noexcept说明符和编译器优化的不清楚的东西。指定noexcept时,编译器可能会优化: 编译时间(更快的编译) 执行时间(代码运行速度更快) 或者两者都有 还是没有 noexpect的最初原因是,如果规范不允许调用函数抛出,则库可以在内部使用更快的移动构造函数 接下来,当您的类型的move构造函数和move赋值用noexcept注释时,可以在STL vector之类的容器中实现大的性能优化。当STL实用程序std::move_如果_noexcept检测到您的移动没有抛出,它

我读过一些关于noexcept说明符和编译器优化的不清楚的东西。指定
noexcept
时,编译器可能会优化:

  • 编译时间(更快的编译)
  • 执行时间(代码运行速度更快)
  • 或者两者都有
  • 还是没有

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

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

(引自)


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



我看不出noexcept说明符对编译时有多大的影响。不过,生成的运行时可以快得多。

编译器不会基于
noexcept
优化任何内容。只有你的代码可以优化东西,通过强制编译器根据
noexcept
是否可用来选择不同的函数。@Nicolas我知道使用noexcept的目的不是为了优化。但在四处搜索时,我在这方面找到了各种各样的答案(),我仍然不清楚编译器到底可以(或应该)选择什么,甚至还不清楚现在说什么还为时过早。