10

私はcnPackを使用していますクリーナーを使用していますが、一般的に、役に立たないユニットを持つことの欠点はどれですか?

私はそれらのいくつかを知っています:

1)もちろん、ユニットがプロジェクト全体で使用されない場合、無駄なリソースの消費が発生します

2)コードインサイトは役に立たない結果をもたらします

3)コードの洞察が遅くなります

しかし、単純なケースを想像してみてください。

  • 2つのフォームを持つプロジェクトがあり、そのうちの1つでStrUtilsを使用していますが、両方でStrUtilsを宣言しました...この場合のメモリ消費量の欠点はありますか?
4

3 に答える 3

16

いいえ。通常、スマートリンクは次のように機能します。

  • どこかでユニットを使用する場合、少なくとも初期化とファイナライズのコードはリンクされています。
  • 原則として、メインプログラム(.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) が照会されます)

于 2010-12-23T15:02:25.350 に答える
7

Delphi スマート リンカは未使用のコードを無視するため、通常、これらの「余分な」ユニットが存在してもコンパイル済みプログラムのサイズは増加しません。

未使用のユニットの欠点について、このリンクから得たいくつかのポイントを次に示します

  1. 維持するコードがよりクリーンになり、使用されていないコードを気にする必要がなくなります
  2. 未使用ユニットの初期化およびファイナライズ セクションからのコードは、
  3. コンパイルがよりスムーズかつ迅速に実行されます
于 2010-12-23T15:01:28.507 に答える
6

私の考えでは、最大の問題は、Delphi のスコープ規則に引っかかることがあるということです。異なるユニットに同じ名前の 2 つの識別子がある場合、この名前を使用すると、uses 句で最後に宣言されたユニットで宣言された名前が参照されます。

これが原因で問題が発生した場合は、いつでも識別子を完全に指定できます。私が本当に見たいのは、uses 句スコープ規則のこの最新の宣言によってのみ ID が決定される識別子に名前を付けているかどうかを知らせるコンパイラの警告です。

于 2010-12-23T16:45:48.267 に答える