2017-01-31 9 views
-2

У меня есть класс Singleton:Конструктор класса перед главным() (C++)

// in global space 
TNCManager *TNCManager::_globalInstance = new TNCManager(); 

Почему конструктор TNCManager выполняется перед функцией main()?

+2

Короткий ответ: это поведение, указанное в стандарте. Длинный ответ: избавься от него. – SergeyA

+1

Поскольку он глобальный, он должен быть полностью построен до начала 'main'. Если бы вы не использовали его? Если это произошло когда-то во время 'main' (может быть, обработано другим потоком), откуда бы вы знали, была ли она построена или нет? Если это произошло после «main», программа закончится. – Kevin

+2

Проверьте http://stackoverflow.com/questions/1008019/c-singleton-design-pattern для идиоматического пути и ленивой конструкции. –

ответ

1

Почему конструктор TNCManager выполняет функцию main()?

Все глобальные статически выделенные объекты будут созданы до запуска main(). Следовательно, конструктор вызывается с new TNCManager().

идиоматический способ, который позволяет избежать строительств перед любым доступом (ленивой конкретизацией), чтобы написать:

// in class space 
class TNCManager { 
public: 
    TNCManager& instance() { 
     static TNCManager theInstance; 
     return theInstance; 
    } 
    // ... 
}; 

Подробное описание объяснило here.

+0

Недостатком является то, что каждое использование 'instance' получает проверку ветви и атомного флага. Хотя ветвь имеет шанс быть предсказанной (не обязательно!), Штраф за атомный флаг неизбежно. – SergeyA

+0

@ Raindrop7, no, вы не можете определить глобальные объекты в 'main'. – SergeyA

+0

@SergeyA Эта проверка атомного флага звучит терпимо для большинства ситуаций. –

-1

Практически, поскольку main() может и должен иметь возможность использовать TCNManager. Способ работы приложений - выделить память, загрузить код и данные, инициализировать хранилище, а затем вызвать _main(). До C++ инициализация данных просто заключалась в копировании исходных данных в хранилище. С классами это включает вызов конструктора.

Смежные вопросы