1. 程式人生 > >C++11新特性(51)- 移動建構函式通常應該是noexcept

C++11新特性(51)- 移動建構函式通常應該是noexcept

不會丟擲異常的移動建構函式

拷貝建構函式通常伴隨著記憶體分配操作,因此很可能會丟擲異常;移動建構函式一般是移動記憶體的所有權,所以一般不會丟擲異常。

C++11中新引入了一個noexcept關鍵字,用來向程式設計師,編譯器來表明這種情況。

noexcept函式

對於永遠不會丟擲異常的函式,可以宣告為noexcept的。這一方面有助於程式設計師推斷程式邏輯,另一方面編譯器可以更好地優化程式碼。

為了說明這個效果我們將Tracer類稍作修改。

分別在拷貝建構函式和移動建構函式(noexcept)中實際上丟擲異常看看程式的反應。

沒有宣告noexcept的情況

首先是沒有宣告為noexcept的拷貝建構函式。

try處理中呼叫了拷貝建構函式,輸出結果如下:

異常被正常捕捉。

聲明瞭noexcept函式的情況

try處理中呼叫了宣告為noexcept的移動建構函式,輸出結果如下:

同樣的try/catch構造已經不能捕捉移動建構函式丟擲的異常從而導致程式終止。這說明noexcept影響了編譯器生成的程式碼。

作者觀點

生成高效程式碼的另一個側面就是功能的缺失,高階的東西有時候可能是雙刃劍,要理解了才能用好。

覺得本文有幫助?請分享給更多人。

閱讀更多更新文章,請掃描下面二維碼,關注微信公眾號【面向物件思考】