Arhn - архитектура программирования

Когда инициализируются встроенные переменные в статическом хранилище?

Стандарты С++ (по крайней мере, до С++ 17) говорят это о порядке инициализации.

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

C++17 вводит встроенные переменные, что, как я полагаю, означает, что одна переменная с статической длительностью хранения а область пространства имен и динамическая инициализация могут быть определены в нескольких единицах перевода.

Дает ли С++ какие-либо гарантии относительно порядка инициализации этих переменных?


Ответы:


1

См. [basic.start.dynamic] p1:

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

Следовательно, тип описываемой вами переменной имеет частично упорядоченную инициализацию. Согласно п2:

Динамическая инициализация нелокальных переменных V и W со статической длительностью хранения упорядочена следующим образом:

  • ...
  • If V has partially-ordered initialization, W does not have unordered initialization, and V is defined before W in every translation unit in which W is defined, then
    • if the program starts a thread (4.7) other than the main thread (6.6.1), the initialization of V strongly happens before the initialization of W;
    • в противном случае инициализация V выполняется до инициализации W.
  • ...

Итак, подведем итог, предполагая, что на картинке нет экземпляров шаблонов:

  • Если у вас есть две встроенные переменные области имен V и W, так что V определяется перед W в каждой единице перевода, то V инициализируется до W.
  • Если только V является встроенным, а W является некоторой невстроенной переменной области видимости пространства имен, определенной ровно в одной единице перевода, V будет инициализирована перед W, если определение V предшествует W в этой единице перевода.
  • Если не встроенная переменная определена перед встроенной переменной, порядок их инициализации не может быть гарантирован.

Интуитивный способ представить порядок инициализации состоит в том, что, как и в C++14, компилятор инициализирует каждую единицу трансляции по порядку, при этом относительный порядок различных единиц трансляции не указан (и они могут чередоваться друг с другом), но встроенная переменная с внешней связью считается инициализированной в первый раз, когда реализация сталкивается с одним из ее определений, которое может быть в любой единице перевода.

См. также стр.5:

Реализация определяет, выполняется ли динамическая инициализация нелокальной встроенной переменной со статической продолжительностью хранения до первого оператора main или откладывается. Если это отложено, то это происходит до любого неинициализирующего использования этой переменной. Реализация определяет, в каких потоках и в каких точках программы происходит такая отложенная динамическая инициализация.

09.08.2019
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..