什么时候变量在C ++中作为参数传递时被复制?

时间:2012-09-18 08:59:21

标签: c++ pointers assembly reference

  

可能重复:
  How is reference implemented internally?

void f (int& a)
{
    a ++;
}

int main ()
{
    int b = 5;
    f(b);
    cout << b << endl; //prints 6
}

当我在C ++中看到引用的语法时,它最初看起来像变量b(如果它是一个对象)将被复制到f中。这些引用如何实际工作? (一些简单的asm会很棒。)

2 个答案:

答案 0 :(得分:3)

在这种情况下,pass-by-reference最有可能使用指针语义 - 即对象的地址可能作为参数传递。\

  

当我在C ++中看到引用的语法时,它最初看起来像变量b(如果它是一个对象)将被复制到f。

不。这是参考的好处之一 - 没有复制。

    f(b);
00DF1405  lea         eax,[b]  
00DF1408  push        eax  
00DF1409  call        f (0DF1177h)  
00DF140E  add         esp,4  

eax将包含b的地址,然后将其推送到函数参数堆栈。

答案 1 :(得分:2)

在C ++引擎的引擎下完全像指针一样实现。唯一的区别是一些编译时检查和不同的语法。 所以在你的情况下,函数f得到一个指向整数b的“指针”,并递增b的值。