Frage

Ich bin bei der Verringerung der Dateigröße meiner Anwendung interessiert. Es ist ein MFC / C ++ Anwendung mit MVC gebaut ++ in Visual Studio 2008. UPX macht einen guten Job von der endgültigen exe auf etwa 40% seiner ursprünglichen Größe reduziert, aber ich möchte es mehr reduzieren.

MFC muss statisch in diesem Projekt verknüpft werden.

Ich habe einige Methoden versucht, in dieser Frage vor: verringern-windows-ausführbare Datei-Größe . Insbesondere unterschiedliche Einstellungen für den Compiler / Linker Anwendung.

Ich glaube, ich habe die Größe reduzieren kann durch einen Blick auf den ‚Kosten‘, die von einschließlich bestimmten Header in dem Projekt.

Jeder Tipp, wie man über diese gehen, vielleicht ein Werkzeug, das meinen Code für mich analysieren könnte? Dank

War es hilfreich?

Lösung

Sie sind in dieser wahrscheinlich falsch. Entfernen von Header können in etwas kürzere Bauzeiten führen, sondern als das, was sie enthalten, ist meist Erklärungen (die man an einem gewissen Punkt müssen sowieso) sollten sie wenig oder keinen Einfluss auf die Größe der endgültigen ausführbaren Datei.

Andere Tipps

Der einzige Weg, um die Größe des Projektes zu reduzieren, ist die Menge an Code zu reduzieren. Wie Neil erwähnt, wird das Entfernen Header nur die Bauzeit verkürzen. Compiler wird nicht alles enthalten, wenn eine „using namespace“ Klausel zu tun, sie werden nur das auswählen, die benötigt wird. Nun, auf der anderen Seite, wenn Sie Header, um die Dinge Zugabe sind nicht überall an alle im Rahmen des Projektes verwendet werden, die ein guter Indikator für eine Klasse ist, die entfernt werden sollen.

Ihre Annahme ist offensichtlich, dass ausführbare Größe ist irgendwie die Summe der Komponenten beitragen, insbesondere Quelldateien. Es funktioniert einfach nicht so.

Zum Beispiel übernehmen Sie den Code für std::list<T>::size. Es kann in vielen Übersetzungseinheiten verwendet werden. Dennoch wird der Linker zusammen viele Kopien faltet, manchmal sogar für verschiedene Arten T. Aber wie würden Sie erklären das resultierende Bytes im ausführbaren?

Nun, wenn Sie nicht einmal bestimmen, wie Konto für das Bytes dieser einfachen (Satz) Funktionen, dann, wie würden Sie machen noch komplexere Konstrukte? Und wenn Sie nicht Bytes in der ausführbaren Datei zu indivual Quelldateien verwendet zuweisen, dann können Sie nicht einzelne Beiträge bestimmen.

Headers typischerweise nur enthalten:

  1. Makros
  2. Typdefinitionen (wie Klassen)
  3. Funktion Vorwärtsdeklaration (die Funktionsdefinition ist in der .c / CPP-Datei)

Keine der oben tatsächlich Ergebnisse in Maschinencode erzeugt werden, es sei denn, sie tatsächlich durch den Code in Ihren .c /.cpp-Dateien verwendet werden.

Nun sind alle die oben genannten Bedürfnisse analysiert werden (die Zeit zu kompilieren, fügt), aber es sei denn, tatsächlich verwendet ignoriert werden.

Die meisten der vorhandenen Antworten sind davon ausgegangen, dass Header nur Erklärungen enthalten, die auf ausführbare Größe keinen Einfluss haben. Natürlich, das ist wahr, wenn diese Annahme hält, aber es ist immer ziemlich häufig für Header eigentlichen Code als auch (Funktionsdefinitionen, in der Regel) enthalten, und diejenigen tun, tragen zur Codegröße.

Auf der anderen Seite tragen sie nur, wenn diese Funktionen tatsächlich in die endgültige ausführbaren Datei verknüpft sind. Und sie sind nur in die endgültige ausführbare Datei verknüpft, wenn Sie Anruf die Funktionen. Also auch wenn der Kopf zu wachsen Ihre Größe der ausführbaren Datei beitragen könnten, was werden Sie dagegen tun? Sie können den Code nicht entfernen, dass Sie Verwendung . Das Entfernen der Header-Datei ist nicht nur eine Option dann - es sei denn, Sie bewegen, dass Code irgendwo anders, und dann wird es die ausführbare Größe erhöhen sowieso

.

Also entweder ein Header macht keinen Unterschied, oder es macht einen großen Unterschied, weil Sie den Code verwenden, die in ihm ist, und dann kann es nicht entfernt werden. In jedem Fall ist das Entfernen Header, die Sie nicht viel los zu kaufen.

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