调用函数和被调用函数之间的共享变量
Shared variables between calling and called functions
在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?更重要的是,调用函数和被调用函数的共享变量是否存在单独的内存位置?
您的示例不在调用函数和它调用的函数之间共享数据:当您调用 sum(int,int)
时,copy A
和B
是在 sum
的激活记录中创建的,这意味着如果 sum
决定修改其 NUMA
和 NUMB
参数,则不会对A
或 B
在 main()
函数内。
为了在调用函数和被调用函数之间共享数据,调用者需要将引用或指针传递给被调用函数*。发生这种情况时,指针或引用存储在被调用函数的激活记录中,但共享的数据存储在调用者的 space 中。
考虑这个例子:
void bar(int& x) {
x = 321;
}
void foo() {
int x = 123;
bar(x);
}
foo()
的 x
的内存在 foo()
和 bar(int&)
之间共享,如下所示:
foo()
的激活记录拥有 x
,而 bar(int&)
的激活记录拥有对 x
的引用。
* 存在其他共享数据的方式,例如使用全局变量和静态变量,或者在成员函数之间共享数据时将共享数据存储在实例对象中。我们不会在这里考虑它们,因为它们在广泛的参与者之间共享数据,而不是在两个功能之间共享数据。
在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?更重要的是,调用函数和被调用函数的共享变量是否存在单独的内存位置?
您的示例不在调用函数和它调用的函数之间共享数据:当您调用 sum(int,int)
时,copy A
和B
是在 sum
的激活记录中创建的,这意味着如果 sum
决定修改其 NUMA
和 NUMB
参数,则不会对A
或 B
在 main()
函数内。
为了在调用函数和被调用函数之间共享数据,调用者需要将引用或指针传递给被调用函数*。发生这种情况时,指针或引用存储在被调用函数的激活记录中,但共享的数据存储在调用者的 space 中。
考虑这个例子:
void bar(int& x) {
x = 321;
}
void foo() {
int x = 123;
bar(x);
}
foo()
的 x
的内存在 foo()
和 bar(int&)
之间共享,如下所示:
foo()
的激活记录拥有 x
,而 bar(int&)
的激活记录拥有对 x
的引用。
* 存在其他共享数据的方式,例如使用全局变量和静态变量,或者在成员函数之间共享数据时将共享数据存储在实例对象中。我们不会在这里考虑它们,因为它们在广泛的参与者之间共享数据,而不是在两个功能之间共享数据。