2013-03-17 130 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。結果運行時間可能會快很多。