C++ 中的引用调用是如何工作的?

How call by reference work in c++?

考虑以下函数原型:

swap(int &a,int &b);

'x' 和 'y' 是 main 函数局部的两个整数。 假设控件在 main() 函数中。 现在,当编译器遇到这种类型的语句时:swap(x,z); 引擎盖下到底发生了什么(我的意思是,就内存位置而言)? 我的问题是:-

  1. swap() 函数的堆栈中是否有分配给 a,b 的内存?如果分配了,它将存储什么?
  2. 引用调用如何工作?

Is there any memory allocated for a,b in swap() function's stack?If allocated, what would it store?

首先考虑在调用swap_ptr(int *a, int *b)时对同一个问题的回答假设使用栈来传递参数,那么在ab中会分配一些内存呼叫 swap_ptr(&x, &y)。该内存将保存指向 xy.

的指针

传递引用时会发生同样的事情:在堆栈上分配一些内存以传递引用 ab,并使用对 x 和 [=15 的引用进行初始化=].此内存通常具有与指针相同的布局,但标准不要求:用于传递引用的结构是特定于实现且不透明的。

How does call by references work?

与按值调用的工作方式相同,除了编译器知道构造引用,而不是复制被传递的对象。

  1. Is there any memory allocated for a,b in swap() function's stack?

排除函数调用被内联扩展为优化的可能性:是的,将在调用堆栈上分配内存。

If allocated ,what would it store?

可用于访问引用对象的内容。实际使用的是被引用对象的内存地址。

  1. 当您按值传递时,会为您的对象分配堆栈内存。当您通过指针或引用传递时 - 堆栈上的内存仅分配给变量的 pointer/address。

  2. 在语法中 - 通过引用调用就像通过值调用一样。但在引擎盖下有指针,因此在使用引用时可以使用 virtual 函数进行动态调度。

这里的根本答案是栈内存和堆内存的区别。

当你按值传递时,你将一个值压入堆栈 "pass by value" 堆栈上的一个 space 被分配以分配该值(这里的好处是它非常快!但堆栈是也被系统严格控制)。

当您通过引用传递时,您将指针传递到系统中某个位置的已分配内存对象,C++ 将创建一个指针,指向其对堆中资源的最佳猜测。

因为 C++ 无法预测引用资源在程序运行完成时会变成的大小,所以它使用它在应用程序实例化时配置的垃圾内存(是的流行语 weeee)! (下次有人说 "blew the stack" 他们错了,他们超过了 运行 堆,哎呀!很难真正破坏堆栈,大多数时候内存是有限的)

这方面的好文章:http://tooslowexception.com/heap-vs-stack-value-type-vs-reference-type/

干杯!并且不要超时工作对你不利:)