デルファイ、文字列の対は、widestringメモリ使用量の問題、非Unicode VCL(D7)
-
22-09-2019 - |
質問
私は(名前、説明、およびいくつかの他のような)それらを記述するパラメータをWideStringにしていくつかのクラスを格納しています。私は、単純な「文字列」に、すべてのものをWideStringsを変更する場合は今(私はので、私は1行のみを変更する必要があり、実際にエイリアスを使用しています)、メモリ使用量は約5%大きい!!以前よりも... 文字列の各文字がWideChar型?
の2倍小さいのでどのように、その可能です事前に感謝!
M
解決
Delphiのメモリマネージャは、オペレーティングシステムに、すべての未使用のメモリを解放しません。断片化はまた、非常にひどくで蹴ることができます。どちらも、あなたは(FastMMが良いD7の株式メモリマネージャよりも通常であるが、任意のメモリマネージャは、メモリの使用パターンのメモリマネージャの特定のシリーズを使っての膝にすることができる)を使用し、実際のメモリマネージャに依存します。彼らはCOM文字列であるにもかかわらずさらに、WideStringsは、参照カウントされていない、とさえ後に通常の文字列より発売されていない可能性があります。
Delphiでの問合せ実際のメモリのメッセージへの唯一の信頼できる方法は、メモリマネージャあなたのDelphiのプログラムの使用を依頼することです。 システム単位でのこの機能は、あなたのためにそれを行います:
function GetHeapStatus: THeapStatus
- イェルーン
マルコによるコメントに反応して20100104:編集: (FastMMは、通常、より良いD7の株式メモリマネージャよりもですが、任意のメモリマネージャは、メモリの使用パターンのメモリマネージャの特定のシリーズを使っての膝にすることができる)
他のヒント
それは可能です。他のスペースはハンドル、さまざまなオブジェクトなどで使用されます。
例のために、聞かせてのは、ANSI文字列を使用しているときに、テキストの100キロバイトについて持っていると仮定して、あなたの代わりにWidestringsに変換します。だけが100キロバイトは影響を受けるだろうが、これらの100キロバイトはあなたのプログラムのメモリフットプリントのすべての単一のバイトを構成するものではありません。スペースは、フォーム、ハンドル、数字、およびその他のオブジェクトに使用されますが、彼らは、変換中に変更されていないので、彼らは明らかに、変換前よりも多くのメモリを必要としません。
はWideStringsのAnsiString(Delphiの)を異なるメモリ・マネージャ(Windowsのいずれか)を使用し、参照が異なるカウントされます。どのようにしてメモリ使用量を測定したのですか?どのようなツールとどのように正確にカウンタ?
どのように使用されるメモリを測定するのですか? IIRC WideStringにメモリがSysAllocString()を使用して割り当て、それによってDelphiのメモリマネージャバイパスされます。
Delphiでメモリマネージャは、常にそれが本当に必要とするよりも、より多くのメモリを取ります。このような速度向上である。
あなたはAnsiStringのを使用するか、またはWideStringにを使用しない場合のタイプをShortStringのされていますか?それは、(グローバルまたはいくつかの単位のいずれかで)あなたは、{$ H-}コンパイラフラグでコンパイルされている可能性があるという扱いのShortStringなど、すべての「文字列」タイプ?あなたの文字列がのShortString型であり、あなたは、文字列のサイズを指定しない場合は、割り当てられたメモリは常に256バイトです。