2011-09-29 25 views
6

可能重複:
What is the difference between r-value references and l-value references? (CodeGen)C++:什麼是技術級別(ASM)的R值引用?

我想知道,任何人都可以解釋R值引用是在技術層面上?我的意思是:創建R-Value引用時,彙編程序級會發生什麼情況。

對於一個小測試,看看會發生什麼裏面我寫了下面的代碼:

char c = 255; 
char &c2 = c; 
char &c3 = std::move(c); 

我知道這是沒有意義的創建R值參考「C」,而只是爲求測試我無論如何做了它,看看它做了什麼。而這裏的結果:

unsigned char c = 255; 
    mov   byte ptr [c],0FFh 
unsigned char &c2 = c; 
    lea   eax,[c] 
    mov   dword ptr [c2],eax 
unsigned char &&c3 = std::move(c); 
    lea   eax,[c] 
    push  eax 
    call  std::move<unsigned char &> (0ED1235h) 
    add   esp,4 
    mov   dword ptr [c3],eax 

我至今沒有ASM專家,但在我看來,在這種情況下,「C3」到底是一個普通參考「C」。

如果我的R值參考直接結合到一個臨時(炭& & C3 = 255),的彙編變化這樣的最後一個比特:

unsigned char &&c3 = 255; 
    mov   byte ptr [ebp-29h],0FFh 
    lea   eax,[ebp-29h] 
    mov   dword ptr [c3],eax 

從該變化的外觀上來看,我假定c3實際上仍然是對某個存儲位置的引用,它保存了值255.所以這是一個常規引用​​ - 該值不會被複制/分配給c3。這是真的?

有人可以說如果我的假設是正確的,或者如果我完全脫離軌道?到現在爲止,我一直認爲R值參考在調用分辨率時匹配函數/方法簽名(可能是移動ctor),以便編碼員知道如何處理提供的數據(對於移動計算器那將會移動數據而不是複製它)。

爲了捍衛這個我剛剛提出的相當愚蠢的嘗試:我不打算在ASM級別上使用我的代碼,我只是想展示哪些技術差異R值參考介紹與其他已有這些年來。

任何見解和解釋都比歡迎!

謝謝!

+3

在(未優化的)程序集級別,R值是對象的實例,就像L值,引用或「值」。 R值只是告訴_compiler_複製/構造使用哪些函數。這與對象或參數中的引用實際上只是程序集級別的指針相似,但編譯器_對其進行了不同的處理。 –

+1

請注意'c3'是一個l值參考值,而不是r值。 – avakar

+3

「技術」。你繼續使用這個詞。我不認爲這意味着你的想法。 –

回答

8

創建R值引用時,彙編程序級會發生什麼情況。

無論如何保留高級語義。什麼編譯器完全取決於編譯器廠商的想法是一個好主意。大會沒有左值,右值或引用的概念,所以不要再尋找它們。打開優化,你正在查看的代碼可能會改變(或者如果變量未被使用,可能會停止存在)。

我只是想展示什麼技術差異R值參考介紹相比,其餘的已經在所有這些年。

Rvalue引用啓用移動語義,而這些引用啓用重要的優化機會。標準沒有說「哦,這些是右值,這就是你應該如何在彙編中實現它們」。實施可能甚至不會產生組裝。

4

優化之前,引用存在爲包含綁定對象地址的指針。

但編譯器會盡力優化它。內聯特別可能會導致所有使用小函數內的引用參數被替換爲直接使用包含綁定對象值的寄存器。

6

右值引用在asm級別上沒有區別 - 它可能與常規引用完全相同(取決於編譯器如何看待它)。只有C++ langiage級別存在差異。 信息r值引用攜帶的是被引用的對象是臨時的,接受它的任何人都可以自由修改它。有關對象位置的信息可能與常規引用完全相同(編譯器可能嘗試以不同方式對其進行優化,但這是編譯器的內部問題)。

r值引用和非常量l值引用的區別在於,每個l值只會自動轉換爲l值引用(從而防止意外修改),而r值表達式將會轉換爲兩者(使用r值ref。preffered),允許移動語義和常規調用,如果不支持移動語義。 std :: move只是允許非自動將l值轉換爲r值引用。

0

右值引用的概念可以在C++級完全描述,不需要爲此讀取彙編代碼。你只需要獲得一些最小的C++類來分配內部資源,而另一個對象「竊取」右值引用資源是顯而易見的。與此經典文章中的remote_integer類相似:http://blogs.msdn.com/b/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx 此代碼的彙編轉換非常簡單,但差異在C++代碼中可見。關於像char這樣的簡單類型 - 它們可以用來展示一些右值引用語法特徵,但是在C++和彙編級別上沒有這種類型的右值引用。所以,如果你在C++中看不到使用char的好處,那麼在Assembly中也沒有什麼有趣的地方。