メモリからクラスのサイズを最適に決定するにはどうすればよいですか?ここでクラスまたはオブジェクトのサイズをファイルサイズと同じ形式で取得するには?
はで動作するように、基本的なサンプルクラスです - 変数は、例えば以外の目的を果たしていない注:私がやりたいのは何
type
TMyClass = class
public
fString1: string;
fString2: string;
fInteger1: Integer;
fInteger2: Integer;
constructor Create;
destructor Destroy; override;
end;
は、それがあたかも同じサイズを返すですディスク上のファイル。
ファイルにTMyClassを保存した場合、ファイルのサイズがたとえば2.4kbだった場合、ファイルがディスク上にある(メモリからサイズを取得する)必要がなくても、その値を取得したいと思います。
InstanceSize
だけ今まで私のクラスに戻りますTMyClass.InstanceSizeを使用する:
私が検索し、ここに尋ねる前に読んでてきたが、これは私が混在結果と、これまでにしようとしているものです値12
にSizeOf
私のクラスににSizeOf(TMyClass)を使用は、値が、私はなどキロバイトとメガバイトとしてファイルサイズ形式にフォーマットする返すどのような値4.
を返し
私がやっている必要があります実際に私のクラスでは12(または4)バイト以上のデータが使用されていることが分かっていますので、何か間違っています。また、私は正しいクラスを参照していることを知っています。これは、実行時に使用するだけでなく、Form CreateおよびDestroyイベントで作成および解放するクラスと同じです。
私はそれについて正しい方法を実行しようとしていますか?もしそうなら、私の例はうまくいきますか?彼らがうまくいくならば、私は実際のクラスとオブジェクトをもっと見る必要があることを知っています。
これを達成するための汚い方法は、私のオブジェクトクラスをファイルに保存し、ファイルサイズを読み取り、次に一時ファイルを削除することです。しかし、私はそのようなアプローチをするのが好きではない、私は彼らが汚れていると思うし、ショートカットを取る。目的は、保存や一時ファイルなどに頼らずに、メモリからクラスのサイズを読み込むことです。
あなたのアドバイスや提案を感謝します。
ファイルをディスクに保存する方法を説明してください。また、 'TMyClass.InstanceSize'は質問のコードに対して12を返すことはできません。質問内のコードが使用しているコードと同じコードであることを確認してください。 –
フィールドを公開し、RTTIを使用し、フィールドのタイプ(整数、文字列など)に基づいて、クラスがディスク上で使用するサイズを計算することができます。 – ComputerSaysNo
拡張されたRTTIを使用することを望む(そしてバージョンを持っている)場合は、これを "メモリから"行うことが可能であるはずです。ただし、別の(集約された)インスタンスへの参照を(再帰的に)カウントするかどうかを判断する方法を見つける必要があります。拡張RTTIを使用できない、または使用したくない場合は、各クラスがSizeCalculation procを登録して「メモリサイズ計算」で使用するフレームワークを作成しました。 SizeCalculationプロシージャは、文字列とどのインスタンス/インタフェース参照をカウントするか(再帰的に)扱う方法を知っています。 –