Delphiアプリケーションのメモリフットプリント
-
30-09-2019 - |
質問
私は大規模なDelphiアプリケーションを持っています、そして、私はメモリのフットプリントを低く抑えようとしています。
私のプログラムでは、TACOから継承するコンポーネント(Taco)とコンポーネント(Tburrito)を使用しています。現在、実際のインスタンスではなく、クラスのメモリ使用に関するものについてだけで、どのシナリオがより多くのメモリを使用していますか?
A.どこでもTburritoコンポーネントのみを使用します
また
B. TacoとTburritoコンポーネントの組み合わせを使用していますか?
私の考えは、TburritoがTacoを継承しているため、クラスのTacoはすでにメモリに保存されているため、それを使用してもメモリのフットプリントはそれほど増加しないということです。
*注 - コンポーネント名は、実際にはタコスとブリトーではありません。
解決
のすべてのインスタンス Burrito
少なくともインスタンスと同じくらいのメモリを占有します Taco
. 。減算します Taco.InstanceSize
から Burrito.InstanceSize
どれだけどれだけあるかを知るために。
使用 Burrito
排他的にあなたに記憶を救うことはありません。の定義 Taco
少なくとも、その正確なクラスのインスタンスがない場合でも、まだ存在します。 Burrito.ParentClass
それでもそれを参照する必要があります。
ニーズを達成する最小のコンポーネントを使用しますが、 Burrito
は 巨大 に比べ Taco
または、多数があります Burrito
可能性のあるインスタンス Taco
代わりに、インスタンスでは、おそらくメモリの使用に全体的な影響があまり見られないでしょう。それは、フォーム全体をロードすること、または全体の代わりにファイルの断片をロードすることを控えることから生じます。
他のヒント
クラスは、VMTにメモリを使用するだけです。実際にクラスをインスタンスするまで、VMTのスペースを占有するのではなく、各クラスにVMTは1つだけです。 VMTサイズは、各仮想メソッドに1つのエントリがあるため、クラスが実際に持っている仮想メソッドの数にのみ依存します。静的メソッドはコンパイル時に解決され、メモリスペースは使用しません。他のVMTデータのサイズは固定されています(ただし、Delphiの異なるバージョンでは異なる場合があります)。 VMTを小さく保つために動的な方法が導入されました。これは、クラスを継承すると、親クラスの仮想メソッドのすべての「スロット」と継承クラスのものを備えた新しいVMTが作成されるためです。動的方法ランタイムディスパッチコードを使用して、呼び出される方法を探します。それらはやや遅いため、それらの使用は、非常に大きな親クラスのいくつかの方法しかオーバードであるクラスでのみ提案されました。メモリが問題でない場合、それらを使用する理由はありません。また、メモリスペースを使用できるのはRTTIの情報ですが、それらがどのように保存されているかを調査することはありません。とにかく、子供のクラスも子どものクラスを使用している場合、子のクラスは継承されたクラスを呼び出すことができるため、親VMTも必要です。ただし、多くの仮想メソッドと少数のインスタンスを備えた非常に大きなクラスを使用しない限り、アプリケーションで使用されるメモリのほとんどは、クラスVMTではなくクラスインスタンスのメモリになると思います。