如何通过引用来调用c ++?

时间:2018-02-05 16:03:08

标签: c++ pass-by-reference

考虑以下函数原型:

swap(int &a,int &b);

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

  1. 是否在swap()函数的堆栈中为a,b分配了内存?如果已分配,它会存储什么?
  2. 引用来电如何运作?

4 个答案:

答案 0 :(得分:4)

  

是否在swap()函数的堆栈中为a,b分配了内存?如果已分配,它会存储什么?

首先,在调用swap_ptr(int *a, int *b)时考虑相同问题的答案假设堆栈用于传递参数,一些内存将分配给调用中的abswap_ptr(&x, &y)。该记忆将指向xy

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

  

引用来电如何运作?

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

答案 1 :(得分:2)

  
      
  1. 是否在swap()函数的堆栈中为a,b分配了内存?
  2.   

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

  

如果已分配,它会存储什么?

可用于访问引用对象的东西。实际上,使用引用对象的内存地址。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

这里的基本答案是堆栈内存和堆内存之间的区别。

按值传递时,将值“按值传递”到堆栈上,在堆栈上分配了一个空间来分配该值(这里的好处是非常快!但是堆栈也受到堆栈的严格控制)系统)。

通过引用传递时,会将指针传递给已分配的内存对象,在系统和C ++中的某些位置,它将创建一个指针,以最佳方式猜测堆中的资源。

因为C ++无法预期引用资源在程序运行到完成时会变成多少大小,所以它将使用垃圾内存,该内存是在应用程序实例化时配置的(是时髦的单词weeee)! (下一次有人说“炸毁堆栈”是错误的,他们跑了堆,哎呀!很难真正地炸毁堆栈,在大多数情况下,内存受到限制)

关于此的好文章:http://tooslowexception.com/heap-vs-stack-value-type-vs-reference-type/

干杯!并且不要随着时间的推移而工作对您不利:)