2010-06-20 60 views
3

從較低級別的角度來看,r值引用是什麼樣的。我似乎無法把頭圍住它!我可以看到來自r值參考與l值參考的生成代碼(等效C或x86/x64)的示例嗎?r值引用和l值引用有什麼區別? (CodeGen)

例如,這個構造看起來像什麼?現在讓我們假設沒有複製elision。

vector<SomethingHUUGE> myFunc(); 
void foo(vector<SomethingHUUGE>&&); 

int main() { foo(myFunc()); return 0; } 

回答

5

代碼生成的目的沒有區別。兩者之間唯一的語義區別是,你知道RValue引用即將被銷燬,而左值引用不會。

+0

那麼r值引用不會生成更快的代碼? – 2010-06-20 23:32:35

+3

@wowus:不直接,不。他們在實踐中生成更快的代碼的原因是他們啓用移動構造函數,這可以節省大量的時間。爲什麼複製矢量時,當你知道源在超出範圍時被銷燬? – 2010-06-20 23:34:09

+0

Sorta另外一個問題......但是移動構造函數被調用後,類會被破壞,類似於如何處理複製構造? – 2010-06-20 23:35:03

0

一個右值,表達式中沒有名稱。

大多數情況下,它是一個臨時對象。 如果你沒有任何方式在表達式後使用它,那麼它是一個r值。

2

它可能有助於將這兩種引用視爲高級概念。它們都沒有明顯的低級實施。他們可以都由指針表示,但通常它們只是高級別名,因此它們根本沒有低級別表示。不會生成額外的代碼,引用僅由其引用的對象替換。

在代碼生成之前無法完全消除引用的情況下,rvalue和lvalue引用通常都以指針的形式表示爲內存地址。

相關問題