寫這篇文章純屬意外收穫.
先看一段**:
在這段**中定義了建構函式,拷貝建構函式,移動建構函式,賦值構造,移動賦值構造,以及析構函式.
#include
using
namespace std;
classaa
(const a &a)
a(a &&a)
a &operator=(
const a &a)
else
return
*this;}
a &operator
=(a &&a)~a
()private
:int i;};
inline a foo()
intmain()
此處在以前我可能會分析這段**效率會很低,呼叫了1次建構函式,2次移動拷貝建構函式,三次析構函式.
具體流程為,
maybe,部分人還有其他答案,但是把這段**編譯執行看看結果呢?
➜ g++ main.cpp -std=c++11
➜ ./a.out
constructor
destructor
哈哈,**居然只呼叫了一次構造,一次析構?**是我錯了?居然比我想想的簡單高校很多,這是為何
程式邏輯上來說,上面的幾次構造與析構沒問題,只是編譯的時候編譯器進行了rvo優化.換一種編譯方式可驗證我們的分析
➜ g++ main.cpp -std=c++11 -fno-elide-constructors
➜ ./a.out
constructor
move constructor
destructor
move constructor
destructor
move constructor
destructor
destructor
rvo即 「return value optimization」,是一種編譯器優化技術,通過該技術編譯器可以減少函式返回時生成臨時值值(物件)的個數,可以提高程式的執行效率,對需要分配大量記憶體的類物件其值複製過程十分友好。
在 c++11 標準中我們可以看到關於該優化標準的更多資訊。標準中規定,在以下兩種環境下,要求編譯器省略類物件的複製和移動構造,即使複製/移動建構函式和析構函式擁有可觀察***。rvo優化直接將物件構造到它們本來要複製/移動到的儲存中。只要語言確保不發生複製/移動操作,複製/移動建構函式就不必存在或可訪問,即使在概念上。這兩種環境分別是:
編譯器優化RVO和NRVO
編譯器選擇 如果想自己實踐rvo和nrvo,不要在vs下嘗試 這裡的vs不是指vs code 用支援g 的編譯器去測試 我這裡用的是mingw 因為vs無論在debug還是release下都是無法關閉rvo優化的,dubug下可以關閉nrvo優化。而g 預設都是執行nrv0優化的。rvo nrvo ...
C 編譯器優化
1 volatile 順序性 兩個包含volatile變數的指令,編譯後不可以亂序。注意是編譯後不亂序,但是在執行的過程中還是可能會亂序的,這點需要由其它機制來保證,例如memory barriers。不可優化性 volatile告訴編譯器,不要對這個變數進行各種激進的優化,甚至將變數直接消除,保證...
C 編譯器優化
1 volatile 順序性 兩個包含volatile變數的指令,編譯後不可以亂序。注意是編譯後不亂序,但是在執行的過程中還是可能會亂序的,這點需要由其它機制來保證,例如memory barriers。不可優化性 volatile告訴編譯器,不要對這個變數進行各種激進的優化,甚至將變數直接消除,保證...