2 Stimmen

Wie Singleton in Boost implementieren alle Singletons initialisiert werden, bevor Haupt aufgerufen wird?

Der Quellcode des Singletons von boost lautet dort Ich verstehe zwei Bezeichnungen in der folgenden Quelldatei nicht:

// ***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);
}

Frage ist: Wie könnte dieser Code die Initialisierung von Singleton in C++ vor main() erzwingen?Was bedeuten diese beiden Notationen?

2voto

Yakov Galka Punkte 65787

Das kann es nicht. Es ist diese Linie, die es tut:

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

Er erstellt ein statisches Objekt, das durch einen Aufruf von get_instance . Da es sich um ein klassenstatisches Objekt handelt, wird es vor main initialisiert.

1voto

Fred Foo Punkte 341230

Ich glaube, der erste Kommentar bezieht sich auf die obige Zeile,

BOOST_DLLEXPORT static T & instance;

die eine static Instanz von T . Die Statik wird initialisiert, bevor main gestartet wird, ist das nur eine C++-Regel.

1voto

Geoffroy Punkte 12093

Sie zeigen nur einen Teil des Codes, was vielleicht erklärt, warum Sie ihn nicht verstehen.

Bevor ein Programm ausgeführt wird, muss es zunächst in den Speicher geladen werden. Wird dabei eine statische oder globale Bereichsvariable gefunden, wird sie entweder mit dem angegebenen Wert oder dem Standard-Compilerwert initialisiert.

Wenn Sie dann eine statische Instanz der Klasse angeben, wird ihr Konstruktor noch vor main aufgerufen! Das ist es, was boost verwendet, um diese Funktionalität bereitzustellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X