Frage

ich auf einem C ++ Programm arbeitete und den kompilierten Objektcode aus einer einzigen 1200-line-Datei (das eine ziemlich komplexe Zustandsmaschine initialisiert) kommt auf fast einem Megabyte. Was könnte die Datei so groß sein, zu machen? Gibt es eine Weise, die ich finden kann, was Raum innerhalb der Objektdatei nimmt?

War es hilfreich?

Lösung

Es kann mehrere Gründe geben, wenn Objektdateien sind größer als sie bei mindestens sein müssen:

  • statisch einschließlich abhängigen Bibliotheken
  • Gebäude mit Debug-Informationen
  • Gebäude mit Profilinformationen
  • Erstellen (extrem) komplexe Datenstrukturen Vorlagen (möglicherweise rekursive boost-Strukturen)
  • mit
  • Drehen nicht Flaggen auf der Optimierung beim Kompilieren (spart nicht so viel und kann zu Schwierigkeiten führen, wenn auch extrem verwendet)

Zuerst habe ich zu überprüfen vorschlagen, wenn Sie mit Debug-Informationen Gebäude sind, das bewirkt, dass die meisten aufblasen in meiner Erfahrung.

Andere Tipps

(Ich gehe davon aus Sie Optimierungen und totem Code Strippen eingeschaltet haben).

Schalten Sie den Linker die Option "Map-Datei erzeugen" und überprüfen Sie die Ausgabe.

Häufige Verursacher sind Makros / Vorlagen, die große Mengen an Code erzeugen und große globale Objekte.

Möglicherweise einige Template-Instanziierungen (vor allem der std::iostreams), und vielleicht umfangreichen inlining (d-Klassen, die in einem Header vollständig definiert sind). Doch was ist das Problem mit einer 1-Megabyte-Objektdatei in erster Linie? Während der Verknüpfung, könnte es sehr gut in einem kleinen binären führen. Ich habe hier ein Projekt mit 20 MiB von Objektdateien, die beispielsweise in ein 700 KiB binären verknüpft werden.

Update: Könnte auch einige große statische Array / Objekt sein. Abgesehen davon, mit MSVC ++ und GCC, Sie an der generierten Assembly für eine Datei suchen, die Ihnen einige Hinweise geben können (mit GCC, es ist g++ -S foo.cpp, für MSVC ++, es ist '/ FAs' ). Entweder Sie werden sehen, viel von Template-Instanzen, dann ist der Grund. Wenn nicht, es ist die Objektgröße von static Objekten.

Ein weiterer möglicher Grund ist Link-Zeitcodegenerierung, eine VC ++ Option. Dadurch wird das Back-End des Compilers in den Linker. Dies ermöglicht eine bessere Optimierungen, aber die Objektdatei hat jetzt alle internen Datenstrukturen enthalten in der Regel zwischen Front- und Backend übergeben.

Hier ist ein Makro Ich sehe verwenden, um Zeitwerte kompilieren:

template <size_t N> struct compile_time_number { private: typedef int check; };
#define compiler_check_number(N) ((compile_time_number< N >::check)0)

Dann bei der Kompilierung glücklich gehen, um zu sehen, was Symbole Platz einnehmen.

Edit: Da niemand das zu verstehen scheint, werde ich klarstellen: die Art und Weise zu verwenden, diese compiler_check_number(sizeof(<insert struct or global variable here>)) hinzuzufügen ist. Der Compiler wird die Größe der Variable oder Struktur als die Kompilierung Fehler ausspucken. Sehr selten ist der Code der Grund für eine große Objektdatei.

Ich benutze das die ganze Zeit, um zu sehen, wie groß sind die Dinge ohne einen Debugger ausführen zu müssen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top