【问题标题】:Shared variables between calling and called functions [closed]调用函数和被调用函数之间的共享变量[关闭]
【发布时间】:2016-04-06 00:49:27
【问题描述】:

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

【问题讨论】:

  • 在这种情况下,“共享变量”是什么意思?一些示例代码会很有用。
  • “共享变量”是什么意思?请用一个小代码示例说明您的问题。
  • 您还必须命名一个实现。这不是“在 C++ 的上下文中”的问题,而是在 C++ 的实现的上下文中。

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


【解决方案1】:

您的示例不会在调用者函数和它调用的函数之间共享数据:当您调用 sum(int,int) 时,AB副本 会在激活记录中创建的sum,这意味着如果sum 决定修改其NUMANUMB 参数,则ABmain() 函数内不会有明显的后果。

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

考虑这个例子:

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

foo()x 的内存在foo()bar(int&amp;) 之间共享,如下所示:

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

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

【讨论】:

  • 这种情况下的公共变量D呢? D被调用函数修改了吗?
  • @SiddharthJoshi D 这两个函数并不常见。每个函数都有自己的局部变量D,对其他函数完全不可见。
  • 但是在处理的时候,这些函数不要引用同一个内存位置。我想,主内存中的内存位置仅由其命名空间和变量名来标识。
  • @SiddharthJoshi 不,Ds 不会指代内存中的同一个地方,因为每个都放在自己函数的激活记录中。
  • OK 我很困惑,因为我了解到激活记录只存储了函数的局部变量,我把它们误认为是除D等公共变量之外的所有变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
相关资源
最近更新 更多