2012-01-08 3 views
3

メモリからクラスのサイズを最適に決定するにはどうすればよいですか?ここでクラスまたはオブジェクトのサイズをファイルサイズと同じ形式で取得するには?

はで動作するように、基本的なサンプルクラスです - 変数は、例えば以外の目的を果たしていない注:私がやりたいのは何

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イベントで作成および解放するクラスと同じです。

私はそれについて正しい方法を実行しようとしていますか?もしそうなら、私の例はうまくいきますか?彼らがうまくいくならば、私は実際のクラスとオブジェクトをもっと見る必要があることを知っています。

これを達成するための汚い方法は、私のオブジェクトクラスをファイルに保存し、ファイルサイズを読み取り、次に一時ファイルを削除することです。しかし、私はそのようなアプローチをするのが好きではない、私は彼らが汚れていると思うし、ショートカットを取る。目的は、保存や一時ファイルなどに頼らずに、メモリからクラスのサイズを読み込むことです。

あなたのアドバイスや提案を感謝します。

+2

ファイルをディスクに保存する方法を説明してください。また、 'TMyClass.InstanceSize'は質問のコードに対して12を返すことはできません。質問内のコードが使用しているコードと同じコードであることを確認してください。 –

+0

フィールドを公開し、RTTIを使用し、フィールドのタイプ(整数、文字列など)に基づいて、クラスがディスク上で使用するサイズを計算することができます。 – ComputerSaysNo

+0

拡張されたRTTIを使用することを望む(そしてバージョンを持っている)場合は、これを "メモリから"行うことが可能であるはずです。ただし、別の(集約された)インスタンスへの参照を(再帰的に)カウントするかどうかを判断する方法を見つける必要があります。拡張RTTIを使用できない、または使用したくない場合は、各クラスがSizeCalculation procを登録して「メモリサイズ計算」で使用するフレームワークを作成しました。 SizeCalculationプロシージャは、文字列とどのインスタンス/インタフェース参照をカウントするか(再帰的に)扱う方法を知っています。 –

答えて

9

InstanceSizeのように、どのようにして12を得たかわかりません。それは20(D2009以前)または24(D2009以降)でなければなりません。保存されたファイルの実際のサイズよりも非常に小さい理由は、文字列がオブジェクト自体に保持されていないためです。それらは参照型であり、実際の文字列データへのポインタとして実装されています。

「ダーティーアプローチ」が正しいトラックにあります。そのようなオブジェクトに必要なディスク容量の大きさを調べる唯一の方法は、実際にそれをシリアル化することです。しかし、それをディスクに保存する必要はありません。 TFileStreamを使ってオブジェクトを保存している場合は、TMemoryStreamを使用してメモリバッファに保存します。次に、ストリームのSizeを取得します。これは、オブジェクトのシリアル化されたサイズです。すべて、一時ファイルを作成してから削除する必要はありません。

+0

あなたのアイデアのMasonを使って作業しました。私のオブジェクトとクラスはストリーミング可能ですので、あなたが提案したようにTMemoryStream .Sizeを使用してください。ありがとう –

関連する問題