2009-01-06 2 views
6

Ich bin ein C++ - Entwickler und Visual Studio 2008 verwenden. Wie kann ich * .obj Dateien Größe reduzieren? Ich habe why are my visual studio .obj files are massive in size compared to the output .exe? gelesen, aber habe die Antwort nicht gefunden.VisualStudio * .obj Dateigröße (513Mb Objs und 534Mb Lib)

Wenn ich Projekt zu einer statischen Lib erstellen, ist die Gesamtgröße aller * .obj-Dateien 513Mb und die resultierende lib ist 534Mb. Jede Obj-Datei ist 1-13 MB. Debug EXE-Datei ist 11 MB. Link-Zeitcode-Generierung (/ Gm) ist deaktiviert.

Vielen Dank im Voraus.

Antwort

5

Objektdateien werden aufgrund der großen Menge an doppeltem Code und Symbolen, die in mehrere Objektdateien eingefügt werden, häufig groß. In der Regel wird dies durch Kopien von Inline-Funktionen und instanziierten Vorlagencodes verursacht.

Die resultierende ausführbare Datei ist viel, viel kleiner als die Summe aller Objektdateien, da duplizierte schwache Symbole und nicht referenzierte Symbole verworfen werden können.

Persönlich würde ich nicht über Objekt Dateigröße kümmern, aber wenn Sie es reduzieren möchten, dann minimieren Sie die Verwendung von Inline-Funktionen und halten Vorlage Code in separaten Dateien aus dem anderen Code und explizite Instanziierung, um die erforderlichen zu generieren Instanziierungen an nur einem Ort.

Beispiel

Angenommen, Sie diese Datei in einem Header haben.

template< class T > 
inline void F(T* t) 
{ 
    // ... some code 
} 

Wenn Sie F für eine Handvoll Typen verwenden, dann wird jede Übersetzungseinheit für die Typen Kopien der Funktion erzeugen, die es verwendet.

Wenn Sie es mit nur einer Erklärung ersetzen:

template< class T > void F(T* t); 

dann können Sie nur die instantations generieren, die Sie in einer separaten Quelldatei benötigen:

template< class T > void F(T* t) 
{ 
    // definition 
} 

template void F<int>(int*); 
template void F<char>(char*); 
template void F<MyType>(MyType*); 

Natürlich müssen Sie jetzt Manuell verwalten, für welche Typen Sie eine Template Instanziierung benötigen.

+1

Was meinen Sie "explizite Instanziierung verwenden, um die erforderlichen Instanziierungen an nur einer Stelle zu generieren"? – kFk

Verwandte Themen