Linker, Loader und ausführbare Formate
Welcher Mechanismus lässt in C++ die Konstruktoren globaler Objekte vor main ausführen?
- ADie CPU findet die Konstruktoren und führt sie automatisch zuerst aus
- BDer Compiler schreibt stets alle Konstruktoren in die erste Zeile der Funktion main
- CDie Adressen der Funktionen, die die Konstruktoren aufrufen, werden in Tabellen wie .init_array gesammelt, und der Startcode ruft sie vor main der Reihe nach auf
Antwort und Erläuterung anzeigen
Antwort: C. Die Adressen der Funktionen, die die Konstruktoren aufrufen, werden in Tabellen wie .init_array gesammelt, und der Startcode ruft sie vor main der Reihe nach auf
Der Compiler erzeugt für jede Datei eine Funktion, die die globalen Objekte initialisiert, und legt deren Adresse in der speziellen Section .init_array ab. Der Linker fasst die .init_array aller Dateien zu einer Tabelle zusammen, und Startcode oder dynamischer Linker rufen die Funktionen dieser Tabelle vor main der Reihe nach auf. Verarbeitungen bei der Beendigung werden entsprechend in .fini_array gesammelt. Die Reihenfolge der Initialisierung über Dateigrenzen hinweg ist nicht festgelegt; daher ist darauf zu achten, keine Abhängigkeiten zu erzeugen.