Переменная static
(это также верно для static
class
членов) инициализируется только один раз - глобально .Даже при первом запуске через область, которая объявляет инициализацию, обычно игнорирует инициализацию, хотя может быть какой-то компилятор, который делает это по-другому - так что это зависит от компилятора.
Причина: инициализация обычно происходит за до того, как ваша main()
функция будет вызвана и часто даже будет отражаться в самом исполняемом / двоичном файле в том смысле, что статические данные записываются там, предварительно инициализированные во время соединения.Это означает, что данные static
большую часть времени будут действительны даже до того, как будет запущен первый фрагмент кода (части среды выполнения C, которые будут вызывать ваш main()
).
Кроме указателя /однако для псевдонимов ссылок не было бы способа получить доступ к такой переменной за пределами ее непосредственной области видимости (окружающие скобки {}
).
С здесь :
6.7 Оператор объявления
Реализация может выполнять раннюю инициализацию других переменных области блока со статическим или потоковым сроком хранения при тех же условиях, что реализация может статически инициализироватьпеременная со статической или продолжительностью хранения потока в области имен (3.6.2).
Большинство реализаций, с которыми я столкнулся во время обратного инжиниринга, похоже, используют это, в частности, потому что применимо также следующее:
3.7.1 Статическая продолжительность хранения
Если переменная со статическим sУ длительности torage есть инициализация или деструктор с побочными эффектами, он не должен быть удален, даже если он не используется, за исключением того, что объект класса или его копирование / перемещение могут быть удалены, как указано в 12.8.
... что означает, что имеет смысл static
вести себя подобно тому, как это было в C - т.е. инициализировать его содержимое заранее, если инициализация была определена во время компиляции.
Многие компиляторы будутв противном случае инициализация с нуля или с некоторым магическим числом (например, в сборках отладки), когда переменная была объявлена, но не инициализирована во время объявления.