可能重複:
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值參考介紹與其他已有這些年來。
任何見解和解釋都比歡迎!
謝謝!
在(未優化的)程序集級別,R值是對象的實例,就像L值,引用或「值」。 R值只是告訴_compiler_複製/構造使用哪些函數。這與對象或參數中的引用實際上只是程序集級別的指針相似,但編譯器_對其進行了不同的處理。 –
請注意'c3'是一個l值參考值,而不是r值。 – avakar
「技術」。你繼續使用這個詞。我不認爲這意味着你的想法。 –