HardstaticUB

Что такое static initialization order fiasco?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Static initialization order fiasco — проблема порядка инициализации нелокальных static-объектов в разных translation units. Порядок между TU не определён, поэтому если static-объект в файле A зависит от static-объекта в файле B — UB.

// ПЛОХО: logger.cpp: Logger logger; — порядок не определён
//         user.cpp:   Foo f(&logger); — f может увидеть logger = 0

// ХОРОШО: Meyers singleton — локальный static
Logger& logger() {
    static Logger inst;   // инициализируется при первом вызове
    return inst;          // потокобезопасно с C++11
}
Foo f(logger());  // гарантия: logger уже создан

Глобальные объекты с нетривиальной инициализацией в новом коде — антипаттерн. Meyers singleton (static локальная переменная) решает проблему: инициализация при первом доступе, потокобезопасна.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.