2010-12-02 9 views
3

私は大きなデルファイアプリケーションを持っており、メモリフットプリントを低く抑えようとしています。私のデルファイアプリケーションのメモリフットプリント

私のプログラムでは、コンポーネント(Taco)とタコを継承するコンポーネント(TBurrito)を使用しています。今では、実際のインスタンスではなく、クラスのメモリ使用量に関して、どのシナリオがより多くのメモリを使用していますか?タコとTBurrito成分の組み合わせを使用してどこにでも

又は

B.だけTBurritoコンポーネントを使用

A.?

TBurritoはTacoを継承しているので、Tacoクラスはすでにメモリに保存されているため、メモリのフットプリントはあまり増えません。

*注 - コンポーネント名は、実際にはTacoおよびBurritoではありません。

+1

あなたが正しいです、両方のクラスのコードとクラスメンバーが含まれています(存在しないと思われる参照されていないコードを削除するスマートリンクがない限りafaik)。 –

+1

AFAIK AFAIK AFAIKほとんどの未使用コードは、有効になりました。 –

答えて

6

Burritoの各インスタンスは、少なくともTacoのインスタンスと同じだけのメモリを占有します。どれくらいもっと多くを見つけるためからTaco.InstanceSizeを差し引く。

Burritoを使用すると、メモリが節約されることはありません。その正確なクラスのインスタンスがない場合でも、少なくともBurrito.ParentClassがそれを参照する必要があるため、Tacoの定義はまだ存在します。

ニーズを実現する最小の部品を使用しますが、BurritoTacoに比べ巨大であるか、あなたの代わりにTacoインスタンス可能性がありBurrito多数のインスタンスを持っていない限り、あなたはおそらく多くの全体的な効果を確認するつもりはありませんあなたのメモリ使用量。これは、フォーム全体の読み込みを控えるか、または全体の代わりにファイルの一部を読み込むことから来ます。

4

クラスはVMTにメモリを使用します。あなたが実際にクラスをインスタンス化するまで、それはスペースを占めるのではなく、VMTのためにあり、各クラスに対して1つのVMTしかありません。 VMTのサイズは、仮想メソッドごとに1つのエントリが存在するため、クラスが実際に持つ仮想メソッドの数にのみ依存します。静的メソッドはコンパイル時に解決され、メモリ空間は使用されません。 他のVMTデータのサイズは固定です(ただし、Delphiのバージョンによって異なる場合があります)。 VMTを小さく保つために動的な方法が導入されました。これは、クラスを継承すると、親クラスの仮想メソッドと継承されたクラスの仮想メソッドのすべての「スロット」を持つ新しいVMTが作成されるためです。動的メソッドは、実行時ディスパッチコードを使用して、呼び出すメソッドを探します。それらは幾分遅いので、非常に大きな親クラスのメソッドをオーバーライドしたクラスに対してのみ使用されます。メモリに問題がなければ、それらを使用する理由はありません。 メモリスペースを使用できるのはRTTI情報ですが、どのように格納されているかについては調べません。 子クラスを使用する場合は、子クラスが継承したものを呼び出す可能性があるため、その親VMTも必要になります。しかし、あなたは非常に大きなクラスを使用しない限り、多くの仮想メソッドといくつかのインスタンス、私はあなたのアプリケーションで使用されるメモリのほとんどは、クラスのインスタンスではなく、クラスのVMTであると思います。

+0

+1クール。いい説明。 –

関連する問題