Распределение памяти в случае статических переменных - PullRequest
4 голосов
/ 08 марта 2010

Меня всегда смущают статические переменные и то, как для них происходит выделение памяти.

Например:

int a = 1;
const int b = 2;
static const int c = 3;

int foo(int &arg){
  arg++;
  return arg;
}

Как выделяется память для a, b и c?

Какая разница (с точки зрения памяти), если я позвоню foo(a), foo(b) и foo(c)?

Ответы [ 2 ]

7 голосов
/ 08 марта 2010

Меня всегда смущают статические переменные

В глобальном масштабе static означает только то, что он не будет виден другим файлам при связывании.

Как распределяется память для a, b и c?

Все они будут жить в исполняемом файле (например, сегмент __DATA), который будет отображаться в оперативной памяти при выполнении. Если компилятор исправен, b и c будут жить в области данных только для чтения (например, сегмент __TEXT) или даже будут исключены из оптимизации.

Какая разница (с точки зрения памяти), если я вызываю foo (a), foo (b) и foo (c)?

foo(b) и foo(c) будут ошибкой компилятора, поскольку const int& не может быть преобразовано в int&.

В остальном без разницы. Передача по ссылке эквивалентна передаче по указателю в смысле процессора. Таким образом, адрес каждой памяти берется, и вызывается foo.

1 голос
/ 08 марта 2010

Память распределяется одинаково для ваших трех переменных. Разница в том, как компилятор обрабатывает их. Так как b и c объявлены с const, компилятор будет вас раздражать, если вы попытаетесь изменить их значения. Поскольку c определено static, оно не будет доступно за пределами текущего файла (к a и b можно получить доступ с помощью extern).

Память для всех трех из них будет выделена внутри исполняемого файла без каких-либо оптимизаций (иногда компилятор может устранить необходимость выделять память для констант, заполняя значение константы везде, где на нее ссылаются).

Ваш вызов функции будет работать для a, но не для b или c без явного приведения (так как ваша функция ожидает указатель на не const int). Тем не менее, ваш компилятор должен вас огорчить, если вы попытаетесь привести значение const к значению, отличному от const.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...