Общие переменные между вызывающими и вызываемыми функциями

В контексте реализации 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 ответ

Решение

Ваш пример не разделяет данные между функцией вызывающей и вызываемой ею функцией: когда вы вызываете 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()"s x делится между foo() а также bar(int&) как это:

Совместное использование переменной х

Активация записи foo() владеет x, в то время как запись активации bar(int&) владеет ссылкой на x,

* Существуют и другие способы совместного использования данных, например использование глобальных и статических переменных или хранение общих данных в объекте экземпляра, когда данные совместно используются функциями-членами. Мы не будем их здесь рассматривать, потому что они обмениваются данными с широким кругом участников, а не делят их между двумя функциями.

Другие вопросы по тегам