4

Delphi でクラス インスタンスの実際のサイズを取得する方法はありますか?

TObject クラスの InstanceSize メソッドについては知っていますが、そのメソッドはオブジェクト メンバーに対して自身を再帰的に呼び出しません。たとえば、次の 2 つのクラスがあるとします。

type MyClass1 = class
  private
    myVar1 : integer;
    myVar2 : integer;
end;

type MyClass2 = class
  private
    myOtherVar1 : integer;
    myOtherVar2 : MyClass1;
end;

このコード セグメントでは、MyClass1 の長さは 12 バイト (整数ごとに 4 バイトとクラス オーバーヘッドの 4 バイト) になり、MyClass2 の長さは 24 バイト (クラス オーバーヘッドに 4 バイト、myOtherVar2 から 12 バイト、myOtherVar1 にさらに 4 バイト) になります。整数)。myOtherVar2 はクラス参照ではなくポインター (4 バイト) として解釈されるため、InstanceSize を使用すると、それぞれが 12 バイトになります。

他のクラス インスタンスへの参照を含むクラスの合計サイズを取得する方法はありますか?

4

5 に答える 5

16

各 MyClass2 が同じ MyClass1 を指すように、1 つの MyClass1 オブジェクトと 100 万の MyClass2 を構築します。

各 MyClass2 はどのくらいのメモリを必要としますか? 12.000012バイト?

循環リストはどのくらいのメモリを消費しますか? 永遠にポインタを追い続けることができる無限ですか?

ポインターを使用する言語では、単純な再帰的な size-of アルゴリズムは一般に役に立ちません。オブジェクトの使用方法に固有の集約/構成、共有、および再帰参照に関する知識を具現化する独自のアルゴリズムを作成する必要があります。

于 2009-01-27T08:31:33.973 に答える
2

使用しているメモリの量を確認するには、オブジェクトが解放されないようにし、FastMMにリークのサイズを通知させることができます。

于 2009-04-06T19:40:07.967 に答える
2

いいえ、あなたが望むものは存在しません。そのようなものが必要な場合は、自分で作成する必要があります。

于 2009-01-27T08:09:34.453 に答える
2

他のクラス インスタンスへの参照を含むクラスの合計サイズを取得する方法はありますか?

あなたはちょうどそれを言った。参照はポインタです。そのサイズは 4 バイトです。InstanceSize によって返される値は、クラスのインスタンス データに割り当てられたバイト数です。

たとえば、myOtherVar2 は nil かもしれません。しかし、nil ポインタ値は依然として 4 バイトのメモリを占有します。

于 2009-01-27T12:32:06.780 に答える
1

オブジェクトによって使用されているメモリをカウントしたいようです。

それを行う必要がある場合は、FastMMがどのように行うかを確認でき、タイプのオブジェクトが作成されたときにプロシージャをフックすることができます。

目標が不明確な多くの作業。あなたはそれを始める前に正当な理由がある方が良いです。

于 2009-01-27T09:45:53.590 に答える