调用和调用函数之间的共享变量

时间:2016-01-01 13:57:11

标签: c++ function memory-management call callstack

在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?更重要的是,调用函数和被调用函数的共享变量是否存在单独的内存位置?

1 个答案:

答案 0 :(得分:1)

您的示例不会在来电者功能与其调用的功能之间共享数据:当您致电sum(int,int)时,复制 AB是在sum的激活记录中创建的,这意味着如果sum决定修改其NUMANUMB参数,则对A没有明显的后果或B函数内的main()

为了在调用函数和被调用函数之间共享数据,调用者需要传递一个引用或指向名为 * 的函数的指针。发生这种情况时,指针或引用存储在被调用函数的激活记录中,但共享的数据存储在调用者的空间中。

考虑这个例子:

void bar(int& x) {
    x = 321;
}
void foo() {
    int x = 123;
    bar(x);
}

foo()x之间共享foo() bar(int&)的记忆:

Sharing variable x

foo()的激活记录拥有x,而bar(int&)的激活记录拥有对x的引用。

* 存在其他共享数据的方式,例如使用全局变量和静态变量,或者在成员函数之间共享数据时将共享数据存储在实例对象中。我们不会在这里考虑它们,因为它们在广泛的参与者之间共享数据,而不是在两个函数之间共享数据。