考虑以下函数原型:
swap(int &a,int &b);
' X'并且' y'是主要功能的两个整数。
假设控件在main()函数中。
现在,当编译器遇到这种类型的语句时:swap(x,z);
在引擎盖下实际发生了什么(我的意思是,就内存位置而言)?
我的问题是: -
答案 0 :(得分:4)
是否在swap()函数的堆栈中为a,b分配了内存?如果已分配,它会存储什么?
首先,在调用swap_ptr(int *a, int *b)
时考虑相同问题的答案假设堆栈用于传递参数,一些内存将分配给调用中的a
和b
到swap_ptr(&x, &y)
。该记忆将指向x
和y
。
传递引用时会发生同样的事情:在堆栈上分配一些内存以传递引用a
和b
,并使用对x
和y
的引用进行初始化。此内存通常具有与指针相同的布局,但标准不要求:用于传递引用的结构是特定于实现的且不透明。
引用来电如何运作?
与按值调用的方式相同,除了编译器知道构造引用,而不是复制正在传递的对象。
答案 1 :(得分:2)
- 是否在swap()函数的堆栈中为a,b分配了内存?
醇>
排除函数调用作为优化内联扩展的可能性:是的,内存将在调用堆栈上分配。
如果已分配,它会存储什么?
可用于访问引用对象的东西。实际上,使用引用对象的内存地址。
答案 2 :(得分:0)
当您传递值时,会为您的对象分配堆栈内存。当您通过指针或引用传递时 - 堆栈上的内存仅分配给变量的指针/地址。
在语法中 - 通过refrence调用就像通过值调用一样。但是在引擎盖下有指针,因此在使用引用时可以使用virtual
函数进行动态调度。
答案 3 :(得分:0)
这里的基本答案是堆栈内存和堆内存之间的区别。
按值传递时,将值“按值传递”到堆栈上,在堆栈上分配了一个空间来分配该值(这里的好处是非常快!但是堆栈也受到堆栈的严格控制)系统)。
通过引用传递时,会将指针传递给已分配的内存对象,在系统和C ++中的某些位置,它将创建一个指针,以最佳方式猜测堆中的资源。
因为C ++无法预期引用资源在程序运行到完成时会变成多少大小,所以它将使用垃圾内存,该内存是在应用程序实例化时配置的(是时髦的单词weeee)! (下一次有人说“炸毁堆栈”是错误的,他们跑了堆,哎呀!很难真正地炸毁堆栈,在大多数情况下,内存受到限制)
关于此的好文章:http://tooslowexception.com/heap-vs-stack-value-type-vs-reference-type/
干杯!并且不要随着时间的推移而工作对您不利:)