Wie verhindere ich, dass meine 'unbenutzten' globalen Variablen kompiliert werden?
Ich bin mit der statischen Initialisierung zu vereinfachen den Prozess der Registrierung einige Klassen, mit einer Fabrik in C++. Leider, denke ich, dass der compiler die Optimierung aus der "unbenutzt" - Objekte, die gemeint sind, zu tun, die sinnvolle Arbeit in Ihren Konstruktoren. Gibt es eine Möglichkeit zu sagen, der compiler nicht optimieren, eine Globale variable?
class SomeClass {
public:
SomeClass() {
/* do something useful */
}
};
SomeClass instance;
Mein Haltepunkt in SomeClass Konstruktor nicht getroffen zu werden. In meinem eigentlichen code, SomeClass ist in eine header-Datei und die Instanz ist, die in eine source-Datei, mehr oder weniger allein.
EDIT: Wie geahnt, die von KJAWolf, dieser code ist tatsächlich kompiliert in eine statische lib, nicht die ausführbare Datei. Sein Zweck ist es, zu registrieren, einige Arten auch durch das statische lib mit einer statischen Liste von Arten und Ihren Schöpfer, für ein Werk zu Lesen dann aus der Konstruktion. Da diese Typen sind mit der lib, diesen code hinzufügen der ausführbaren Datei ist unerwünscht.
Außerdem entdeckte ich, dass durch das verschieben der code, um eine andere Quelldatei mit anderen vorhandenen code, es funktioniert gut. Es scheint, dass eine Datei rein, die aus diesen globalen Objekten ist, was das problem verursacht. Es ist, als ob, die übersetzungs-Einheit wurde komplett ignoriert.
InformationsquelleAutor der Frage Ben Hymers | 2009-08-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der compiler ist nicht erlaubt optimiza entfernt Globale Objekte.
Auch wenn Sie nie benutzt.
Etwas anderes ist passiert in deinem code.
Nun, wenn Sie gebaut eine statische Bibliothek mit Ihrem global-Objekt und das Globale Objekt wird nicht referenziert wird aus der ausführbaren Datei, es wird nicht gezogen werden in die ausführbare Datei durch den linker.
InformationsquelleAutor der Antwort Martin York
Sollte der compiler nie optimieren Sie Weg wie globals - wenn es tut, es ist einfach gebrochen.
InformationsquelleAutor der Antwort Pavel Minaev
Bauen off von Arthur Ulfeldt, volatile sagt dem compiler, dass diese variable ändern können, die außerhalb der Kenntnis des Compilers. Ich habe es für eine Anweisung zu erlauben, dass der debugger einen breakpoint zu setzen. Es ist auch nützlich für die hardware-Registern ändern können, abhängig von der Umgebung, oder Sie benötigen eine spezielle Sequenz. d.h. die Serielle Schnittstelle empfangen, registrieren und bestimmte watchdog-Register.
InformationsquelleAutor der Antwort Robert
könnten Sie
aber ich weiß nicht, ob dass funktioniert nur in Visual Studio ( http://msdn.microsoft.com/en-us/library/chh3fb0k(VS.80).aspx ).
Könnte man auch sagen, dass der compiler nicht optimieren, insbesondere dann, wenn Sie Debuggen...
InformationsquelleAutor der Antwort atk
Können Sie erzwingen, dass ein Objekt (Ihre Liste der Arten) zieht noch einige andere Objekte mit ihm durch teilweise Verknüpfung Sie vor dem Aufbau die komplette statische lib.
Mit GNU-linker:
So, wenn die statische Liste verwiesen wird, die von code mit der Bibliothek, die komplette "TypeBundle.o" - Objekt wird sich mit in das resultierende binary, einschließlich type1.o, Typ2.o, und type3.o.
Während es an, tun, überprüfen Sie heraus die Bedeutung von "-Ur" in das Handbuch.
InformationsquelleAutor der Antwort gatopeich
Sind Sie gcc verwenden, mit gdb? Es wurde ein problem in der Vergangenheit, wo der gdb konnte nicht genau festlegen breakpoints in Konstruktoren.
Außerdem sind Sie mit einer Optimierung, die kann der compiler die inline-Methoden in der Klassendefinition.
InformationsquelleAutor der Antwort Juan
Müssen Sie -ganze-Archiv als Verlinkung. Finden Sie die Antwort hier:
ld-linker Frage: --whole-archive-option
InformationsquelleAutor der Antwort Sam
Ich habe das gleiche setup & problem auf VS2008.
Ich fand, dass, wenn Sie erklären Sie der Klasse mit
dllexport
es wird nicht optimieren.Aber dies erzeugt eine Menge von Warnungen in meinem Fall, weil ich muss erklären, alle Klassen, die in dieser Klasse auch als dllexport.
Alle Optimierungen ausgeschaltet sind (im debug Modus), trotzdem ist das noch optimiert. Auch volatile/pragma optimize off. Auf die Globale variable erstellt dieser Klasse (im gleichen cpp-Datei), etc funktioniert nicht.
Gerade festgestellt, dass die dllexport erfordert mindestens zu enthalten Headerdateien dieser Klassen in einigen anderen cpp-Datei aus der exe-Datei zu arbeiten! So ist nur die option zum hinzufügen einer Datei mit anrufen, um einige statische Mitglieder für jede Klasse, und fügen Sie diese Datei auf alle Projekte verwendet diese Klassen.
InformationsquelleAutor der Antwort fil
Wie wärs mit dem keyword volatile? Es wird verhindert, dass der compiler von zu viel Optimierung.
InformationsquelleAutor der Antwort Partial