Мне посоветовали использовать шаблон Singleton вместо глобальных объектов, которые имеют «статическую» продолжительность хранения, чтобы избежать фиаско статического порядка инициализации. Но теперь, когда у меня есть модули C++20, стоит ли мне это делать?
Фиаско порядка статической инициализации
Фиаско статического порядка инициализации относится к неоднозначности порядка инициализации объектов со статическим сроком хранения в разных единицах трансляции. Если объект в одной единице трансляции полагается на уже инициализируемый объект в другой единице трансляции, сбой может произойти, если компилятор решит инициализировать их в неправильном порядке. Например, порядок, в котором
Код: Выделить всё
.cpp
Within a single translation unit, the fiasco does not apply because the objects are initialized from top to bottom.
Storage duration
“static” storage duration.
The storage for the object is allocated when the program begins and deallocated when the program ends. Only one instance of the object exists. All objects declared at namespace scope (including global namespace) have this storage duration, plus those declared with
Код: Выделить всё
static
Код: Выделить всё
extern
As far as I know…
The “static initialization order fiasco” means that which objects with the “static” storage duration, such as global objects, in non-module
Код: Выделить всё
.cpp
Then, with C++20 modules…
The dependencies between C++ module files (“translation units”) are seemingly clear with the
Код: Выделить всё
import
Код: Выделить всё
import
Источник: https://stackoverflow.com/questions/781 ... 20-modules