Происходит ли фиаско порядка статической инициализации с модулями C++20?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Происходит ли фиаско порядка статической инициализации с модулями C++20?

Сообщение Гость »


Мне посоветовали использовать шаблон Singleton вместо глобальных объектов, которые имеют «статическую» продолжительность хранения, чтобы избежать фиаско статического порядка инициализации. Но теперь, когда у меня есть модули C++20, стоит ли мне это делать?


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

Код: Выделить всё

.cppФайлы 
, указанные в командной строке, могут изменить этот порядок. Идиому Построение при первом использовании можно использовать, чтобы избежать фиаско статического порядка инициализации и гарантировать, что все объекты инициализируются в правильном порядке.
В пределах одного перевода единицу фиаско не происходит, поскольку объекты инициализируются сверху вниз.


Продолжительность хранения< br />«статическая» продолжительность хранения.
Память для объекта выделяется при запуске программы и освобождается при ее завершении. Существует только один экземпляр объекта. Все объекты, объявленные в области пространства имен (включая глобальное пространство имен), имеют этот срок хранения, а также объекты, объявленные с помощью

Код: Выделить всё

static илиextern. Подробности об инициализации объектов с таким сроком хранения см. в разделах «Нелокальные переменные» и «Статические локальные переменные».

Насколько мне известно…< /h2>
«Фиаско порядка статической инициализации» означает, что объекты со «статической» продолжительностью хранения, такие как глобальные объекты, в немодульном режиме.cpp
файлы инициализируются раньше, неоднозначно. Это может привести к сбою при использовании неинициализированного глобального объекта. Чтобы избежать этого, многие приняли шаблон Singleton, в котором реализована функция «конструировать при первом использовании (ленивое конструирование)».
Затем, с модулями C++20…
Зависимости между файлами модулей C++ («единицами перевода») кажутся очевидными с помощью в них. Имеет ли значение фиаско статического порядка инициализации, и мне все равно придется использовать шаблон Singleton вместо того, чтобы-able objects declared at the top level in C++ modules?


Источник: https://stackoverflow.com/questions/781 ... 20-modules
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»