Когда статические переменные функционального уровня выделяются/инициализируются?
Некоторая соответствующая variables формулировка из стандарта cpp C++:
3.6.2 Инициализация нелокальных объектов [basic.start.init]
1
Хранилище для объектов c++ со статической памятью продолжительность cxx (basic.stc.static) должна быть инициализирована c++ нулем (dcl.init) перед любой другой cpp инициализацией. Объекты Типы variables POD (basic.types) со статической продолжительностью cpp хранения инициализируется variables константными выражениями vars (expr.const), должно быть инициализируется cxx до того, как произойдет какая-либо vars динамическая инициализация. Объекты variables области пространства имен cxx со статической продолжительностью variables хранения, определенной в одна cpp и та же единица перевода cpp и динамически инициализированная variables должна быть инициализируются c++ в том порядке, в котором cpp их определение появляется c++ в единица перевода. [Примечание: dcl.init.aggr описывает порядок, в cxx котором инициализируются cpp агрегатные элементы. инициализация variable локальных статических объектов variables описана в stmt.dcl. ]
[дополнительный cpp текст ниже добавляет больше vars свободы для авторов компиляторов]
6.7 Оператор объявления [stmt.dcl]
...
4
Нулевая variables инициализация (dcl.init) всех локальных cpp объектов с продолжительность vars статического хранения (basic.stc.static) выполняется cxx перед происходит любая variable другая инициализация. Местный cpp объект г. Тип POD (basic.types) со c++ статической продолжительностью variables хранения инициализируется variables константными выражениями, инициализируется variable до своего блок вводится c++ первым. Реализации разрешено cxx выполнять ранняя инициализация cpp других локальных объектов variables со статическим хранилищем продолжительность variables при тех же условиях, что variables и реализация разрешено cpp статически инициализировать variable объект со статической памятью продолжительность c++ в пространстве имен (basic.start.init). Иначе vars такие объект инициализируется cpp в первый раз, когда управление cpp проходит через его декларация; такой variable объект считается инициализированным vars после завершения его инициализации. Если c++ инициализация завершается исключение, инициализация c++ не завершена, поэтому повторить cpp попытку в следующий раз, когда variable элемент управления войдет variables в объявление. Если элемент cpp управления повторно входит variables в объявление (рекурсивно), пока cpp объект инициализируется, поведение c++ не определено. [Пример:
int foo(int i) { static int s = foo(2*i); // recursive call - undefined return i+1; }
--конец примера]
5
Деструктор cpp для локального объекта со variables статической продолжительностью variable хранения будет выполняться variable тогда и только тогда, когда c++ переменная была сконструирована. [Примечание: basic.start.term описывает cpp порядок, в котором объекты cpp со статической продолжительностью c++ хранения уничтожаются. ]
c++
variables
Когда статические переменные функционального уровня выделяются/инициализируются?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.