C++ Builder で作成されたさまざまなプロジェクトにほぼ 2 年間取り組んでいます。この間、結果の実行可能ファイルのサイズに関連するいくつかのことに気付きました。私はそれを2つの例で説明しようとしています:
1.今日、1 つのプロジェクトを C++ Builder 6 から C++ Builder XE4 に変換しました。DLL サイズの比較は次のとおりです。
Old DLL 531 968 B
New DLL 3 422 720 B (or more than 6x larger than old one!)
両方のバイナリは、追加のライブラリの静的リンクを使用してリリースとしてコンパイルされます。ライブラリ バージョンを定義するグローバル変数と、製品情報 (バージョン、説明、会社など) を含む実行可能プロパティの変更を除いて、これら 2 つのバージョン間でソース コードの変更はありません。
2.C++ Builder XE2 で作成した VCL プロジェクトに、JCL (JEDI Code Library) プロジェクトからいくつかのファイルを追加しました。私のコードでは JCL からのオブジェクトが作成されないため、コードの一部であってもリンカーは新しいメソッドをリンクすべきではないと思います。それにもかかわらず、バイナリ サイズは 17 900 000 から 19 300 000 に増加しました。他にも小さな変更があったため、正確な数値はわかりません。この増加のごく一部は、170 kB のリソース ファイル JclUnicode.res のリンクに起因する可能性があります。それにもかかわらず、これは、外部コンポーネントを追加してプロジェクトに結果として生じるバイナリ サイズの変化は、エンド ユーザー向けの新しい機能と比較すると適切ではないという私の長年の経験と一致しています。
結果のバイナリには、呼び出されないコードの大部分があるのではないかと疑っています。残念ながら、この仮説を検証する方法はわかりません。使用されたことのないコード/データについて、結果のバイナリを分析できるツールはありますか? C++ Builder リンカは関数レベルのリンクをサポートしていますか? これは、実行可能ファイルをハード ドライブからメモリに読み込むのに必要な時間と、プログラムが占有する RAM メモリのサイズを考慮すると、非常に現実的な問題です。組み込みソフトウェアを開発している私の同僚は、ファームウェアから呼び出されなかった関数を削除することで、そのサイズが 80% 縮小されたという話を私に教えてくれました。