Я иногда сталкивался с "фиаско статического порядка инициализации C++", когда некоторый сложный глобальный объект (например, хеш-таблица) используется другим классом до того, как он был создан, что иногда приводило к сбоям во время инициализации перед main()
Как известно, этого фиаско можно избежать, внедрив части объекта, требующие инициализации, в виде статики в функцию-член, потому что статика в функции всегда инициализируется при первом входе в функцию, например :
struct GlobalHashTable
{
std::map <std::string, int>& stringmap()
{
static std::map <std::string, int> stringmap;
return stringmap;
}
... (remainder safely uses stringmap() to get at properly-initialized map object)
};
Похоже, что "статические встроенные" объекты имеют сходную семантику с этими объектами, встроенными в функцию. Можно ли их безопасно использовать внутри класса, избегая фиаско?
Например,
struct GlobalHashTable
{
static inline std::map <std::string, int> stringmap;
... (remainder safely uses stringmap to get at properly-initialized map object)
};
"Похоже, что "статические встроенные" объекты имеют сходную семантику с этими объектами-встроенными-в-функцию." - почему вы так говорите? Что это за подобная семантика?
На встроенный объект могут ссылаться несколько объектных файлов, но при этом гарантируется, что он будет инициализирован ровно один раз, и я полагаю, что для этого существует своего рода защита вокруг его использования.
Поле, отличное от
inline
,static
, также гарантированно инициализируется ровно один раз, и на него могут ссылаться несколько объектных файлов. Добавлениеinline
не добавляет дополнительных требований к заказу.Не встроенный статический объект должен быть определен ровно в одном объектном файле, где он инициализируется. Требования к заказу кажутся очень разными.
Какие точные требования к заказу? Пожалуйста, обратитесь к определенному разделу стандарта или справочнику.
Я не понимаю: я не говорил, что требования к заказу были точными. Я сказал, что статический объект инициализируется ровно в одном объектном файле, что очевидно.
Инициализация только в одном объектном файле никак не связана с порядком других возможных инициализаций. Вы продолжаете говорить «кажется», но я не вижу где вы видите что-либо, что поддерживает ваше утверждение.
См. здесь обсуждение защиты встроенных переменных. Эти охранники не существуют со статическими переменными. coderhelper.com/questions/56798437/…
Давайте продолжим эту дискуссию в чате.