いいえ。通常、スマートリンクは次のように機能します。
- どこかでユニットを使用する場合、少なくとも初期化とファイナライズのコードはリンクされています。
- 原則として、メインプログラム(.dpr)から直接または間接的に実際に使用する関数/メソッドのみがリンクされます。
- RTTI経由で到達可能な一部のビットもリンクされます。経験則では、列挙型の RTTI は常にリンクされ (列挙型を使用する場合)、(クラスを構築するとすぐに)、公開されたもの、または到達可能なものすべてがリンクされます。公開されたプロパティを介してリンクされています。
- 未使用のユニットを初期化すると、 dllまたは dll のフレームワーク全体 (.NET など) が取り込まれる可能性があり、展開が不要に複雑になる可能性があることに注意してください。
- (Rob がコメントで述べているように)リソースは常にリンクされているもう 1 つの要素です。これは、実行時に使用されるため、コンパイラはそれらが使用されているかどうかを判断できないためです。
- DLL またはパッケージ プロジェクトでは、外部プログラムがそれらを呼び出す可能性があるため、発行されたすべてのシンボルがリンクされます。
結論: 最終的な .exe サイズが決定されます
- 主に上記のルートから到達可能なもの (メインプログラム、初期化、ファイナライズ、構築可能なクラスの RTTI)、
- ユニットが使用されている場合に常にリンクされるいくつかのビット (リソース、列挙型のような特定の形式の RTTI)、
- Ansistring ヘルパー ルーチンのような RTL の言語ヘルパー。これらのほとんどは System にあり、一部はバリアントにある可能性があります。
- 比較的小さな内部プログラム管理(初期化/終了順序を決定するユニットを含むテーブルなど)、リソース処理に必要なテーブル、DLL リンクなど。
- デバッグ情報(TD32 がオンの場合)
- 最適化やランタイム チェックなどのコンパイラ設定も、バイナリ サイズに多少影響します。
- UPX などのバイナリ圧縮ユーティリティ。ただし、私の経験では常に問題が発生するため、これらはお勧めしません。
Free Pascal もおおむね同じように動作しますが、デフォルトが異なるだけです。デバッグは現在、ほぼ常に「バイナリ」(TD32 など) であり、スナップショットでは、スマートリンクはデフォルトでオフになっています。(公式リリースではオンになっています)。
さらに、その大きさを見失ってはなりません。Strutils は全体で最大 15kb 程度です。
(2011-11-01 更新)
私が共有したいこの返信について、sb からのコメントを受け取りました。
基本的に、彼は列挙型が常にリンクされているという発言に疑問を投げかけました。おそらく、列挙型の公開されたプロパティを持つクラスを登録すると、列挙型が引きずり込まれます。理由は理にかなっていますが、まだテストしていません。したがって、enum の RTTI を直接リンクできるのは、typeinfo(tenumtype) がどこかで照会された場合、または使用されているクラスの公開されたセクションで使用されている場合のみです。(直接または typeinfo(theclass) が照会されます)