3

大規模な Delphi アプリケーションがあり、メモリ フットプリントを低く抑えようとしています。

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

A. どこでも TBurrito コンポーネントだけを使用する

また

B. Taco と TBurrito のコンポーネントを組み合わせて使用​​していますか?

私の考えでは、TBurrito は Taco を継承しているため、クラス Taco は既にメモリに格納されているため、それを使用してもメモリのフットプリントはそれほど増加しません。

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

4

2 に答える 2

6

のすべてのインスタンスはBurrito、少なくとも のインスタンスと同じ量のメモリを占有しますTacoTaco.InstanceSizeから引くと、Burrito.InstanceSizeあとどれくらいかがわかります。

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

ニーズを満たす最小のコンポーネントBurrito使用してTacoください。これは、フォーム全体をロードすることを控えたり、ファイル全体ではなく一部だけをロードしたりすることから生じます。BurritoTaco

于 2010-12-02T13:32:54.683 に答える
4

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

于 2010-12-02T14:26:36.627 に答える