3

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% 縮小されたという話を私に教えてくれました。

4

1 に答える 1

3

Embarcadero のフォーラムでは、さまざまなバージョンでの実行可能ファイルのサイズの増加に関連して、数多くの議論が行われてきました。BCB6 と XE4 の間で RTL/VCL に大幅な変更が加えられました。Unicode への切り替え、Delphi Generics および拡張 RTTI の導入など。これらはすべてファイル サイズに影響します。特に C++Builder では未使用の RTL/VCL コードを除外できず、特に拡張 RTTI を Delphi と同様に除外できませんが、Delphi ジェネリックは C++ テンプレートと比較してまだ十分に最適化されていません。

于 2013-10-19T16:12:25.477 に答える