【问题标题】:When do variables get copied when being passed as arguments in C++? [duplicate]在 C++ 中作为参数传递时,变量何时被复制? [复制]
【发布时间】:2012-09-18 08:59:21
【问题描述】:

可能重复:
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 会很棒。)

【问题讨论】:

  • 引用只是原始变量的别名。对引用的任何修改都会修改被引用的变量。不涉及复制。如何实现引用的确切细节未指定 按照标准。话虽如此,大多数编译器在底层只是使用指针来实现引用。
  • 您的编译器将为您提供示例 asm -- 找到用于输出未汇编代码的选项或用于反汇编其二进制输出的工具。

标签: c++ pointers assembly reference


【解决方案1】:

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

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

不。这是参考文献的好处之一——没有复制。

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

eax 将包含b 的地址,然后被压入函数参数堆栈。

【讨论】:

    【解决方案2】:

    在 C++ 引用的底层实现与指针完全一样。唯一的区别是一些编译时检查和不同的语法。 因此,在您的情况下,函数 f 获得一个指向整数 b 的“指针”并增加 b 的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 2015-09-28
      • 2013-07-29
      • 2022-09-21
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多