C 編譯器優化之RVO

2021-10-24 08:49:05 字數 1404 閱讀 1593

寫這篇文章純屬意外收穫.

先看一段**:

在這段**中定義了建構函式,拷貝建構函式,移動建構函式,賦值構造,移動賦值構造,以及析構函式.

#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告訴編譯器,不要對這個變數進行各種激進的優化,甚至將變數直接消除,保證...