1. 程式人生 > 其它 >C++11 關鍵字noexcept

C++11 關鍵字noexcept

noexcept關鍵字是c++11之後新增的。

該關鍵字會告訴編譯器,被修飾的函式不會發生異常,有利於編譯器對程式做更多的優化。

編譯器做程式碼生成時,胡加一些額外的程式碼包裹原始程式碼,當出現異常時可以丟擲一些相關的堆疊錯誤資訊,包含:錯誤位置、錯誤原因、呼叫順序和層級路徑等資訊。

當使用noexcept宣告一個函式不會丟擲異常時, 編譯器就不會去生成這些額外的程式碼, 直接的減小了生成檔案的大小,,間接的優化了程式執行效率。


兩種形式

  1. noexcept 是識別符號時,它的作用是在函式後面宣告一個函式是否會丟擲異常,
  2. noexcept 是函式時,它的作用是檢查一個函式是否會丟擲異常。

使用場景

  • move constructor
  • move assignment
  • swap
  • leaf function

另外,解構函式預設帶noexcept


vector擴容

vector擴容時,會選擇呼叫copy constructor還是move constructor

如果存在noexcept move constructor,才會使用move,否則使用copy。

明顯使用mvoe可以提高效能。

原理:noexcept改變了函式的型別,可以使用type trait判斷是否存在noexcept move constructor


refer

https://zhuanlan.zhihu.com/p/222167649