在C ++实现的上下文中,当调用一个函数时,存储与调用函数有关的共享变量的值在哪里?它们是存储在寄存器中还是存储在被调用函数的激活记录中?
#include <iostream>
using namespace std;
int main() {
int A, B, C, D = 2;
C = sum(A, B);
cout<<C<<D;
return 0;
}
int sum(int NUMA, int NUMB);
int sum(int NUMA, int NUMB) {
int D;
D = numA + numB;
return D;
}
例如,计算机如何在这两个函数中区分D?更重要的是,调用函数和被调用函数的共享变量是否存在单独的内存位置?
答案 0 :(得分:1)
您的示例不会在来电者功能与其调用的功能之间共享数据:当您致电sum(int,int)
时,复制 A
和B
是在sum
的激活记录中创建的,这意味着如果sum
决定修改其NUMA
和NUMB
参数,则对A
没有明显的后果或B
函数内的main()
。
为了在调用函数和被调用函数之间共享数据,调用者需要传递一个引用或指向名为 * 的函数的指针。发生这种情况时,指针或引用存储在被调用函数的激活记录中,但共享的数据存储在调用者的空间中。
考虑这个例子:
void bar(int& x) {
x = 321;
}
void foo() {
int x = 123;
bar(x);
}
在foo()
和x
之间共享foo()
bar(int&)
的记忆:
foo()
的激活记录拥有x
,而bar(int&)
的激活记录拥有对x
的引用。
* 存在其他共享数据的方式,例如使用全局变量和静态变量,或者在成员函数之间共享数据时将共享数据存储在实例对象中。我们不会在这里考虑它们,因为它们在广泛的参与者之间共享数据,而不是在两个函数之间共享数据。