инициализация объектов в с ++ - PullRequest
5 голосов
/ 14 июня 2010

Я хочу знать, в c ++, когда происходит инициализация объектов?
Это во время компиляции или во время ссылки?
Например:

//file1.cpp
extern int i;
int j=5;

//file2.cpp ( link with file1.cpp)
extern j;
int i=10;  

Теперь, что делает компилятор: по моему мнению, он выделяет память для переменных.
Теперь я хочу знать:
он также помещает значение инициализации в это хранилище или выполняется во время соединения?

Ответы [ 3 ]

2 голосов
/ 14 июня 2010

На самом деле есть разные случаи:

  • глобальные переменные или статические переменные (не классы): эти значения хранятся в разделе инициализации exe / dll. Эти значения создаются компоновщиком на основе информации о скомпилированных объектных файлах. (инициализация при загрузке + отображение dll / exe в память)
  • локальные нестатические переменные: эти значения устанавливаются компилятором путем помещения этих значений в стек (push / pop в x86) (инициализация компилятора)
  • объекты: память зарезервирована в стеке, фактическая установка значений откладывается до вызова конструктора (инициализация во время выполнения)
  • указатели на объекты (на самом деле это не новый случай): место зарезервировано только для указателя. Указанный объект существует только после вызова new, который резервирует память и вызывает конструктор для его инициализации (инициализация во время выполнения)
0 голосов
/ 14 июня 2010

В вашем примере нет объектов, просто int s.Если под «инициализацией» вы подразумеваете, когда назначены их значения, эти int s будут преобразованы в записи размером с слово в разделе данных в объектном файле, который будет жестко закодирован с их начальными значениями.Раздел данных вместе с остальным объектным файлом создается компилятором, поэтому я полагаю, что ответ на ваш вопрос - время компиляции

0 голосов
/ 14 июня 2010

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

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