В этой короткой статье я напишу о том, что я узнал о статической/динамической инициализации переменных в C++.

Введение

Привет, меня зовут Владислав, я инженер-программист из Украина. Мой наставник попросил меня подготовить статью об аде порядка статической инициализации в C++. Я начал свое исследование, и мне было трудно разобраться с этой темой. Пару дней я исследовал эту тему, и, наконец, я разобрался с этим. Эта тема не так сложна, как я думал, но информации о ней в Интернете очень мало. По этой причине я решил поделиться своими знаниями с общественностью.
Итак… Начнем!

Статическая и динамическая инициализация

Когда ваша программа компилируется, компилятор должен определить, как обращаться с переменными: когда переменная должна быть инициализирована, при уничтожении, какое начальное значение она должна иметь.
В основном компилятор работает с динамическими инициализируемыми переменными — переменными, которые инициализируются и удаляются во время выполнения.
Но есть переменные, которые инициализируются до запуска программы — эти переменные называются статически инициализированными (переменные глобальной области видимости или помеченные static ключевое слово). Эти переменные имеют статическую продолжительность хранения, что означает, что они инициализируются и оцениваются во время компиляции и существуют все время выполнения программы.
В отличие от статической инициализации. > переменные, есть также переменные динамической инициализации — переменные, которые инициализируются и оцениваются во время выполнения.
Кстати, статические переменные (переменные глобального масштаба или помеченные ключевым словом sstatic) также могут быть инициализированы динамически — во время выполнения. Это происходит, когда компилятор не может оценить значение переменной во время компиляции.

Как инициализируются статические переменные?

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

В каком порядке статические переменные инициализируются?

Статические переменные единой единицы компиляции (один файл) инициализируются в порядке их определения в единице компиляции. Это называется упорядоченная инициализация.

Если статические переменные определены в нескольких единицах компиляции, порядок их компиляции не определен.
Пример:
У нас есть 3 файла: a.cpp, b.cpp, c.cpp
b. cpp определяет глобальную переменную int B= 1;
c.cpp определяет глобальную переменную int C = B + 1;
a.cpp определяет глобальную переменную int A = A+B

Когда я скомпилировал программу (g++ *.cpp), я получил результат:

A=1, но мы предположили, что A = 3
Это произошло потому, что a.cpp был скомпилирован раньше, чем b.cpp или c.cpp и какая-то переменная B или C еще не был инициализирован => имеет значение 0.

Это может привести к множеству трудно распознаваемых ошибок в вашем проекте. Будьте осторожны с этим!.

Краткое содержание

Спасибо за чтение. Надеюсь, эта статья вам хоть как-то помогла