Статическая инициализация происходит перед динамической инициализацией.
Одноэлементное решение, которое вы процитировали, работает, потому что
Singleton* Singleton::_instance = 0;
описывает статическую инициализацию (а именно нулевая инициализация в этом случае, но константа инициализации будет работать так же хорошо, если используется), что гарантированно произойдет до любой динамической инициализации (и, следовательно, до запуска любого кода).Все требования статической инициализации здесь гарантированы, поскольку _instance является глобальной переменной встроенного типа (указатель) и инициализируется нулем.
Другое предоставленное вами решение не меняет ничего существенного, потому что все жегарантированно произойдет только нулевая инициализация _instance до вызова кода из других модулей, так как инициализация с помощью вызова Singleton :: Instance является динамической и поэтому подчиняется static фиаско порядка инициализации .
Реализация - сегмент данных
Примечание. Статическая инициализация чаще всего реализуется путем сохранения значения переменной, которая была вычислена во время компиляции, в сегменте данных исполняемого файла.
Терминология, стандартная кавычка
В то время как большинство программистов (включая Bjarne Stroustrup ) вызывают стиль инициализации, использованный в оригинальной одноэлементной реализации "инициализация времени компиляции"стандарт называет это "статic инициализация », в отличие от« динамической инициализации »(которая чаще всего называется динамической инициализацией).См. C ++ 0x черновик 3.6.2 (укороченный, выделенный):
3.6.2 Инициализация нелокальных переменных [basic.start.init]
... Нелокальные переменные со статической продолжительностью хранения инициализируются в результате запуска программы.... следующим образом.
2 Переменные со статической продолжительностью хранения (3.7.1) ... должны быть инициализированы нулями (8.5) перед любой другой инициализацией.
Инициализация константы выполняется: ...
- , если объект со статической или продолжительностью хранения потока не был инициализирован вызовом конструктора и если каждое полное выражение, которое появляется в его инициализаторе, является константойвыражение.
Вместе, нулевая инициализация и постоянная инициализация называются статической инициализацией;все остальные инициализации - это динамическая инициализация.Статическая инициализация должна быть выполнена до любой динамической инициализации.