@Andrey_Epifantsev

Почему constinit помогает решить проблему static order initialization fiasco?

Почитал несколько источников про новое ключевое слово constinit. Некоторые из них преподносят его как решение проблемы порядка инициализации глобальных переменных. Типа инициализация переносится из runtime в compile time и это позволяет иметь гарантированный доступ к одной переменной при инициализации другой. Я не понял, почему это должно происходить? У нас есть две глобальные переменные. Они в разных единицах трансляции. Единицы трансляции ведь загружаются в произвольном порядке? Каким образом наличие слова constinit в одной из единиц трансляции гарантирует, что она загрузится раньше? А если вторая загрузится раньше, то при инициализации переменной в ней мы получается будет запрашивать ещё не созданную переменную из первой.

Или это как-то иначе работает?
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Единицы трансляции ведь загружаются в произвольном порядке?

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

Каким образом наличие слова constinit в одной из единиц трансляции гарантирует, что она загрузится раньше?

Это слово гарантирует, что такой объект будет инициализирован до начала динамической инициализации, см, а это всё, что требуется для решения проблемы static order initialization fiasco.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы