1

アプリケーションのファイル サイズを小さくしたいと考えています。これは、Visual Studio 2008 で MVC++ を使用してビルドされた MFC/C++ アプリケーションです。UPX は、最終的な exe ファイルを元のサイズの約 40% に縮小するのに優れていますが、もっと縮小したいと考えています。

このプロジェクトでは、MFC を静的にリンクする必要があります。

この質問で概説されているいくつかの方法を試しました: reduce-windows-executable-size。具体的には、コンパイラ/リンカーにさまざまな設定を適用します。

プロジェクトに特定のヘッダーを含める「コスト」を調べることで、サイズをさらに縮小できると思います。

これについてのヒント、おそらく私のコードを分析できるツールはありますか? ありがとう

4

5 に答える 5

8

あなたはおそらくこれで間違っています。ヘッダーを削除すると、ビルド時間がいくらか短くなる可能性がありますが、ヘッダーに含まれているのはほとんどが宣言であるため (いずれにせよ必要になります)、最終的な実行可能ファイルのサイズにはほとんどまたはまったく影響を与えません。

于 2009-12-16T14:13:15.363 に答える
2

通常、ヘッダーには次のもののみが含まれます。

  1. マクロ
  2. 型定義 (クラスなど)
  3. 関数の前方宣言 (関数定義は .c / .cpp ファイルにあります)

上記のいずれも、.c /.cpp ファイル内のコードで実際に使用されない限り、マシン コードが生成されることはありません。

ここで、上記のすべてを解析する必要があります (コンパイル時間が長くなります) が、実際に使用しない限り無視されます。

于 2009-12-16T14:43:09.047 に答える
2

プロジェクトのサイズを小さくする唯一の方法は、コードの量を減らすことです。Neil が述べたように、ヘッダーを削除してもビルド時間が短縮されるだけです。コンパイラは、「名前空間を使用する」節を実行するときにすべてを含めるわけではなく、必要なものだけを選択します。一方、プロジェクト内のどこにも使用されていないものにヘッダーを追加している場合は、削除する必要があるクラスの良い兆候です。

于 2009-12-16T14:17:53.717 に答える
2

あなたの仮定は、実行可能ファイルのサイズが何らかの形で貢献しているコンポーネント、特にソースファイルの合計であるということです。それはそのようには機能しません。

たとえば、 のコードを想定しますstd::list<T>::size。多くの翻訳単位で使用できます。それでも、リンカーは多くのコピーをまとめて折り畳み、時には異なるタイプの T に対しても折り畳みます。

さて、その単純な (セットの) 関数のバイトをどのように説明するかさえ決定できない場合、さらに複雑な構造をどのように説明するのでしょうか? また、実行可能ファイルで使用されるバイトを個々のソース ファイルに割り当てることができない場合、個々の貢献を判断することはできません。

于 2009-12-16T14:20:39.140 に答える
1

既存の回答のほとんどは、ヘッダーには実行可能ファイルのサイズに影響を与えない宣言のみが含まれていると想定しています。もちろん、その仮定が成り立つ場合はそうですが、ヘッダーに実際のコード (通常は関数定義) も含まれることがかなり一般的になりつつあり、それらはコード サイズに影響します。

一方、それらの関数が最終的な実行可能ファイルに実際にリンクされている場合にのみ貢献します。そして、これらの関数を呼び出した場合にのみ、最終的な実行可能ファイルにリンクされます。では、ヘッダーが実行可能ファイルのサイズの増大に寄与する可能性があるとしても、それに対して何をするつもりでしょうか? 使用しているコードは削除できません。その場合、ヘッダーファイルを削除することはオプションではありません-そのコードを別の場所に移動しない限り、とにかく実行可能なサイズが増加します.

したがって、ヘッダーは違いがないか、ヘッダーに含まれるコードを使用するために違いがあり、削除できません。どちらの場合でも、ヘッダーを削除してもあまりメリットはありません。

于 2009-12-16T14:56:59.490 に答える