2016-01-01 64 views
-2

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

+3

“共享变量”在这种情况下意味着什么?一些示例代码会很有用。 –

+1

你是什么意思的“共享变量”?请用一个小代码示例说明您的问题。 –

+1

你也必须命名一个实现。这不是一个“在C++环境下”的问题,而是在C++的_implementation_环境中。 –

回答

1

您的例子中,调用函数和它调用的函数之间不共享数据:当你打电话sum(int,int)副本都ABsum活动记录中创建的,这意味着如果sum决定修改它的NUMANUMB参数,在main()函数内AB不会有明显的后果。

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

考虑这个例子:

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&)拥有对的引用。

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

+0

在这种情况下,共同变量D怎么样? D被调用函数修改了吗? –

+0

@SiddharthJoshi'D'对于这两个函数是不常见的。每个函数都有自己的局部变量'D',这对其他函数是完全不可见的。 – dasblinkenlight

+0

但是在处理时,请不要将这些功能指向同一个内存位置。主内存中的内存位置仅由其名称空间和变量名称来标识。 –