У меня есть класс Singleton:Конструктор класса перед главным() (C++)
// in global space
TNCManager *TNCManager::_globalInstance = new TNCManager();
Почему конструктор TNCManager
выполняется перед функцией main()
?
У меня есть класс Singleton:Конструктор класса перед главным() (C++)
// in global space
TNCManager *TNCManager::_globalInstance = new TNCManager();
Почему конструктор TNCManager
выполняется перед функцией main()
?
Почему конструктор TNCManager выполняет функцию
main()
?
Все глобальные статически выделенные объекты будут созданы до запуска main()
. Следовательно, конструктор вызывается с new TNCManager()
.
идиоматический способ, который позволяет избежать строительств перед любым доступом (ленивой конкретизацией), чтобы написать:
// in class space
class TNCManager {
public:
TNCManager& instance() {
static TNCManager theInstance;
return theInstance;
}
// ...
};
Подробное описание объяснило here.
Недостатком является то, что каждое использование 'instance' получает проверку ветви и атомного флага. Хотя ветвь имеет шанс быть предсказанной (не обязательно!), Штраф за атомный флаг неизбежно. – SergeyA
@ Raindrop7, no, вы не можете определить глобальные объекты в 'main'. – SergeyA
@SergeyA Эта проверка атомного флага звучит терпимо для большинства ситуаций. –
Практически, поскольку main() может и должен иметь возможность использовать TCNManager. Способ работы приложений - выделить память, загрузить код и данные, инициализировать хранилище, а затем вызвать _main(). До C++ инициализация данных просто заключалась в копировании исходных данных в хранилище. С классами это включает вызов конструктора.
Короткий ответ: это поведение, указанное в стандарте. Длинный ответ: избавься от него. – SergeyA
Поскольку он глобальный, он должен быть полностью построен до начала 'main'. Если бы вы не использовали его? Если это произошло когда-то во время 'main' (может быть, обработано другим потоком), откуда бы вы знали, была ли она построена или нет? Если это произошло после «main», программа закончится. – Kevin
Проверьте http://stackoverflow.com/questions/1008019/c-singleton-design-pattern для идиоматического пути и ленивой конструкции. –