Как синглтон в boost реализует все синглеты, которые инициализируются до вызова main? - PullRequest
2 голосов
/ 13 декабря 2011

Исходный код синглтона наддува: там , я не понимаю две записи в исходном файле ниже:

// ***include this to provoke instantiation at pre-execution time***
static void use(T const &) {};

BOOST_DLLEXPORT static T & get_instance() {
static detail::singleton_wrapper< T > t;
***// refer to instance, causing it to be instantiated (and
// initialized at startup on working compilers)***
BOOST_ASSERT(! detail::singleton_wrapper< T >::m_is_destroyed);
use(instance);
return static_cast<T &>(t);
}

Вопрос: как этот код может инициировать инициализацию синглтона в c ++ перед main ()? Что означают эти две записи?

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

Не может. Именно эта строка:

template<class T>
BOOST_DLLEXPORT T & singleton< T >::instance = singleton< T >::get_instance();

Создает статический объект, который инициализируется вызовом get_instance. Поскольку это класс-статический объект, он инициализируется перед main.

1 голос
/ 13 декабря 2011

Вы просто показываете часть кода, которая может объяснить, почему вы не понимаете.

Перед выполнением программы ее необходимо сначала загрузить в память. В то время, если найдена статическая или глобальная переменная области действия, она инициализируется либо указанным значением, либо компилятором по умолчанию.

Тогда, если вы укажете статический экземпляр класса, его конструктор будет вызываться еще до main! Вот что Boost использует для обеспечения этой функциональности.

1 голос
/ 13 декабря 2011

Я думаю, что первый комментарий на самом деле относится к строке выше,

BOOST_DLLEXPORT static T & instance;

, которая создает static экземпляр T.Статика инициализируется до запуска main, это просто правило C ++.

...