C++11 關鍵字noexcept
阿新 • • 發佈:2022-05-06
noexcept
關鍵字是c++11之後新增的。
該關鍵字會告訴編譯器,被修飾的函式不會發生異常,有利於編譯器對程式做更多的優化。
編譯器做程式碼生成時,胡加一些額外的程式碼包裹原始程式碼,當出現異常時可以丟擲一些相關的堆疊錯誤資訊,包含:錯誤位置、錯誤原因、呼叫順序和層級路徑等資訊。
當使用noexcept
宣告一個函式不會丟擲異常時, 編譯器就不會去生成這些額外的程式碼, 直接的減小了生成檔案的大小,,間接的優化了程式執行效率。
兩種形式
- 當
noexcept
是識別符號時,它的作用是在函式後面宣告一個函式是否會丟擲異常, - 當
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