0

それらを説明するWideStringパラメーター(名前、説明など)を持ついくつかのクラスを保存しています。これらすべての WideString を単純な「文字列」に変更すると (実際にはエイリアスを使用しているため、1 行だけ変更する必要があります)、メモリ使用量が約 5% 大きくなります!! 以前よりも...文字列の各文字が WideChar の 2 倍小さいため、どのように可能でしょうか?

前もって感謝します!

メートル。

4

6 に答える 6

4

Delphi メモリ マネージャは、未使用のメモリをすべてオペレーティング システムに解放するわけではありません。断片化も非常にひどく発生する可能性があります。両方とも、使用する実際のメモリ マネージャーによって異なります (FastMM は通常、D7 のストック メモリ マネージャーよりも優れていますが、メモリ マネージャー固有の一連のメモリ使用パターンを使用することで、任意のメモリ マネージャーを屈服させることができます)。さらに、WideStrings は COM 文字列ですが、参照カウントされず、通常の文字列よりも後で解放されない可能性があります。

Delphi で実際のメモリ メッセージを照会する唯一の信頼できる方法は、Delphi プログラムが使用するメモリ マネージャに問い合わせることです。System ユニットのこの関数は、それを行います。

function GetHeapStatus: THeapStatus

--jeroen

edit: 20100104 Marco によるコメントへの反応: (通常、FastMM は D7 のストック メモリ マネージャーよりも優れていますが、メモリ マネージャー固有の一連のメモリ使用パターンを使用することで、任意のメモリ マネージャーをひざまずかせることができます)

于 2010-01-03T12:17:51.380 に答える
0

Delphi のメモリ マネージャは、実際に必要以上のメモリを常に消費します。そんなスピードアップです。

于 2010-01-03T09:52:39.207 に答える
0

これらの文字列は、プログラムの実行に使用されるメモリの (比較的) 小さい部分をほぼ確実に構成するため、可能です。他のスペースは、ハンドル、さまざまなオブジェクトなどによって使用されます。

例として、ANSI 文字列を使用するときに約 100 KB のテキストがあり、代わりにそれを Widestring に変換するとします。これらの 100KB のみが影響を受けますが、それらの 100KB がプログラムのメモリ フットプリントのすべてのバイトを構成するわけではありません。フォーム、ハンドル、数値、およびその他のオブジェクトにはスペースが使用されますが、それらは変換で変更されないため、変換前より多くのメモリを必要としないことは明らかです。

于 2010-01-02T21:55:32.003 に答える
0

WideString を使用しない場合、AnsiString または ShortString 型を使用していますか? すべての「文字列」型を ShortString として扱う {$H–} コンパイラ フラグ (グローバルまたは一部のユニット) を使用してコンパイルしている可能性はありますか? 文字列が ShortString 型で、文字列サイズを指定しない場合、割り当てられるメモリは常に 256 バイトです。

于 2010-01-03T11:43:37.840 に答える
0

WideString は、AnsiString (Delphi のもの) とは異なるメモリ マネージャー (Windows のもの) を使用し、参照カウントも異なります。メモリ使用量はどのように測定しましたか?どのツールとどの正確なカウンターを使用しますか?

于 2010-01-02T22:40:51.953 に答える
0

使用されたメモリをどのように測定しますか? IIRC WideString メモリは、SysAllocString() を使用して割り当てられるため、Delphi メモリ マネージャをバイパスします。

于 2010-01-02T22:42:10.583 に答える