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