2013-03-17 90 views
3

我读过关于noexcept说明符和编译器优化的不清楚的事情。当指定noexcept时,编译器可以优化:noexcept说明符和编译器优化

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

*编译器*不会基于'noexcept'优化任何内容。只有你的*代码*可以通过强制编译器根据“noexcept”是否可用来选择不同的函数来优化。 – 2013-03-17 07:35:39

+0

@NicolBolas我知道使用noexcept的目的不是为了优化。但是四处搜寻,我在这方面找到了混合的答案([就像这样]](http://stackoverflow.com/q/10787766/1316620)),我仍然不清楚究竟什么可以(或应该)被优化编译器,或者即使早点告诉。 – talles 2013-03-17 13:05:59

回答

4

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

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

(从using-noexcept报价)


此外,该编译器不必产生堆栈回卷额外的代码,如果它知道没有异常,可以抛出由于noexpect符。


我看不到编译时如何严重影响noexcept-specifiers。结果运行时间可能会快很多。