Выделение времени памяти - PullRequest
0 голосов
/ 10 августа 2011

Это может показаться очень простым вопросом, но он связан с тем, как работает компилятор. Какова последовательность выделения памяти локальным переменным функции.

Предположим, у меня есть функция

int a,b;
int c1;
int c,d;
int c2;
cout<<&a<<endl;
cout<<&b<<endl;
cout<<&c<<endl;
cout<<&d<<endl;
cout<<&c1<<endl;
cout<<&c2<<endl;
int f;
cout<<&f<<endl;

Здесь f получает наименьший адрес памяти (относительно других переменных), как если бы стек инициализации был построен следующим образом:

a b c1 c d c2 f

и затем память была выделена

Это может произойти, потому что существуют различные фазы компиляции, и это одна из них.

Какой фазе соответствует построение этого стека и в какой фазе фактически выделяется память?

Ответы [ 4 ]

6 голосов
/ 10 августа 2011

Нет никакой гарантии относительно того, какие места будут занимать эти переменные - порядок определения влияет только на порядок вызова конструкторов / деструкторов.

2 голосов
/ 10 августа 2011

Не существует правил для того, как локальные переменные хранятся в памяти, или , если они хранятся - они могут жить в регистре для всей функции.

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

0 голосов
/ 10 августа 2011

Это зависит от компилятора. Это зависит от типа анализа (сверху вниз или снизу вверх и влево или вправо), выполняемого синтаксическим анализатором.

0 голосов
/ 10 августа 2011

Порядок в коде не обязательно связан с порядком в памяти во время выполнения.

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

#include <iostream>

using std::cout;
using std::endl;

int main() {
  int i0;
  char c0, c1;
  int i1;
  short s0;

  cout << &i0 << endl;
  cout << (void *) &c0 << endl;
  cout << (void *) &c1 << endl;
  cout << &i1 << endl;
  cout << &s0 << endl;
  return 0;
}

Используя g ++ 3.4.4 на Cygwin, Windows XP, 32bit, с -Os Я получил следующий результат:

0x22cce0
0x22ccdf
0x22ccde
0x22ccd8
0x22cce6

Это говорит о том, что компилятор группирует переменные по размеру, а не по порядку их объявления. Но в целом на это нельзя полагаться. Например, изменение уровня оптимизации на -O0 изменило порядок в моем случае.

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