2010-06-20 100 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引用通常都以指针的形式表示为内存地址。

相关问题