По статическим и глобальным объектам я предполагаю, что вы имеете в виду объекты с статическим временем жизни, определенным в области пространства имен. Когда такие объекты определены с локальной областью, правила немного отличаются.
Формально C++ инициализирует такие переменные в три этапа: 1. Нулевой инициализации 2. Статическая инициализация 3. Динамическая инициализация Язык также различает между переменными, которые требуют динамической инициализации, и те, которые требуют статической инициализации: все статические объекты (объекты со статическим ) инициализируются сначала нулевым, затем инициализируются объекты со статической инициализацией , а затем происходит динамическая инициализация .
В качестве простого первого приближения динамическая инициализация означает , что некоторый код должен быть выполнен; обычно, статический инициализация нет. Таким образом:
extern int f();
int g1 = 42; // static initialization
int g2 = f(); // dynamic initialization
Другой approximization будет то, что статическая инициализация , что C поддерживает (для переменных со статической жизнью), динамическим всего остального.
Как компилятор делает это зависит, конечно, от инициализации, но в системах на базе дисков, где исполняемый загружается в память с диска, значения для статического инициализации являются частью образа на диске, и загрузили непосредственно системой с диска. В классической системе Unix , глобальные переменные будут разделены на три «сегменты»:
-
текст:
-
код, погрузили в защищенный от записи области. Static Здесь также будут размещены переменные с типами `const`.
-
данные:
-
Статические переменные со статическими инициализаторами.
-
ПБС:
-
Статические переменные с не-инициализатора (C и C++) или с динамическим инициализации (C++). Исполняемый файл не содержит изображения для этого сегмента , и система просто устанавливает все значение `0` перед , начиная свой код.
Я подозреваю, что многие современные системы все еще используют что-то подобное .
РЕДАКТИРОВАТЬ:
Одно дополнительное замечание: выше относится к C++ 03. Для существующих программ C++ 11, вероятно, ничего не меняет, но он добавляет constexpr
(что означает, что некоторые пользовательские функции все еще могут быть статической инициализацией) и локальные переменные потока, , что открывает совершенно новую возможность червей.
Все четыре переменные имеют статический класс хранения. –
@KerrekSB Как «статический класс хранения» относится к моему вопросу? – Zachary
Класс хранения определяет поведение инициализации. –