2016-01-01 1 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++», а в контексте _implementation_ из C++. –

ответ

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&) так:

Sharing variable x

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

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

+0

Как насчет общей переменной D в этом случае? Является ли D измененной вызываемой функцией? –

+0

@ SiddharthJoshi 'D' не является общим для двух функций. Каждая функция имеет свою локальную переменную под названием 'D', которая полностью невидима для других функций. – dasblinkenlight

+0

Но во время обработки эти функции не относятся к одному и тому же месту памяти. Место памяти в основной памяти идентифицируется только своим пространством имен и именем переменной, я полагаю. –

 Смежные вопросы

  • Нет связанных вопросов^_^