C++ c++;当通过引用传递局部变量时,是否处理它们的内存?

C++ c++;当通过引用传递局部变量时,是否处理它们的内存?,c++,memory,compilation,C++,Memory,Compilation,我想我得到了这个功能——将一个引用传递给一个函数会传递地址,因此在下面的get\u point中对a\u val和b\u val的修改会改变调用函数中变量的值 我不明白的是这实际上是如何实现的——值是否移动到堆空间并将其地址传递到get_point?或者可以将调用函数堆栈帧中的地址传递到获取点并在那里修改吗 void calling_func() { float a, b; get_point(a,b); } void get_point(float& a_val, fl

我想我得到了这个功能——将一个引用传递给一个函数会传递地址,因此在下面的
get\u point
中对
a\u val
b\u val
的修改会改变
调用函数中变量的值

我不明白的是这实际上是如何实现的——值是否移动到堆空间并将其地址传递到
get_point
?或者可以将
调用函数
堆栈帧中的地址传递到
获取点
并在那里修改吗

void calling_func() {
    float a, b;
    get_point(a,b);
}
void get_point(float& a_val, float& b_val) {
    a_val = 5.5;
    b_val = 6.6;
}

或者调用func堆栈帧中的地址可以传递到get\u点并在那里修改吗?

  • 确切地说;调用时,每个函数的堆栈向下增长,调用方调用时,上面的调用方堆栈空间仍然有效。通常,这是通过使用
    lea
    指令,将指针传递到可能传递参数的任何位置来实现的:
get_point
内部,rcx和rdx(假设采用win64调用约定)被解引用并移动到xmm寄存器中,以便作为浮点数对这些变量进行操作。这可以通过使用
movss
实现:

movss xmm0, [rcx]  // this is where the actual dereferencing of the references in question happens
movss xmm1, [rdx]

此外,如果您想查看编译器生成的实际程序集,我建议您签出编译器资源管理器()。

堆栈上的对象也有地址。堆栈只是RAM的一个区域;堆只是另一个领域,很可能实现将指针传递给原始变量,然后通过取消引用指针来修改它们。但是作为程序员,编译器是如何“在幕后”完成它的,这在很大程度上与您无关。只要你遵守语言规则,你就会得到预期的结果。它的实现方式可能因编译器而异,通常不需要担心。无论如何,编译器都可以很好地内联此函数,只需在调用_func时对值进行操作。它们甚至可能不存在于调用_func的堆栈中,可能只存在于寄存器空间中。在不同的优化级别查看编译后的代码,看看发生了什么。当您想查看不同编译器使用不同选项生成的代码时,此选项通常很有用。过来看。例如,将您的代码与gcc默认值进行比较,将gcc与
-O2
-O3
进行比较。
movss xmm0, [rcx]  // this is where the actual dereferencing of the references in question happens
movss xmm1, [rdx]