Delphiのメモリのトピック

レッスン1:

、彼らは複数のスレッドを実行可能なプロセス(そのトピックの「マルチスレッドプログラミング」がたくさんある); Windowsはマルチタスクオペレーティングシステムでは、タスクは、アプリケーション(アプリ)、プロセスを占めたアプリケーションです。



各プロセス4GBのアドレス空間へのWin32システムの面では:
ローエンドは2ギガバイト(00000000 $ - $ 7FFFFFFF)ユーザーへの支配、
ハイエンドの2ギガバイト(80000000 $ - $ FFFFFFFF)は、システムの使用のために予約します。



仕事にメモリにファイルやプログラムには、最終的にそれのどのくらいを私たちのメモリを見てみましょう。

システムのルートディレクトリにPAGEFILE.SYSファイルがあり、これは私たちの「仮想メモリ」(仮想メモリファイルは次の形式であるさ)の存在

「仮想メモリ」と呼ばれるPAGEFILE.SYSが不適切と思われる、いわゆる「仮想の」という点では比較的実際の物理メモリ(RAM)であり、多くの書籍の「物理メモリが」実際に意味される:RAM +すべての利用可能なメモリで仮想メモリ、。

また、「ページファイル」、「ページファイル」または「スワップファイル」「仮想メモリとして知られているいくつかの本では、「仮想メモリ」コントロールパネル」の「サイズから設定することができます」 。、デフォルトはシステムによって自動的に管理されている

「仮想メモリ」を使用しても使用する必要がありますどのくらいのRAMに関係なく、システムの仕組みではない「仮想メモリ」を

大RAM、システムは、それによって速度を上げ、より少ない「仮想メモリ」を使用します。しかし、RAMは大きくないが、あなたが本当にメモリの4Gを入れた場合、システムは、4GだけのためのWin32管理能力(アドレス指定)、この場合のコースのときに、他のWin64に認識し、使用3G程度となっていることができ、優れています別の問題。



いわゆる4Gシステムの各プログラムに、4Gへの「仮想アドレステーブル」で、真のメモリ、またはメモ帳になることはありません、電卓は。8Gを必要とした

いくつかの本で呼ばれるこの「仮想アドレスを」また、「仮想メモリアドレス」と呼ばれる「仮想アドレス」、「ページ・マップ」または「仮想メモリアドレス」、コンセプトは簡単で、「仮想メモリ」の混乱である。

そこ4G番号(4294967296この「仮想アドレス」 a)のアドレス(0 - $ FFFFFFFF)、各プログラムは、このようなテーブルを持っていますが、彼らは競合しない、これらのアドレスは、仮想システムであるため、必要なときに、彼らは、特定の実メモリにマッピングされますが、 。このように別のプロセスにプロセスのアクセスをブロックアドレス

今や「仮想アドレス」のメモリを使用すると、アプリケーション・プロセスを通じて、Win2000の以前のリリースでは、公共のメモリをアプリケーションのGlobalAllocで、LocalAllocプライベートメモリに適用されますメモリがプライベートで、今のGlobalAlloc、LocalAlloc違いはありません、同じコードが実行される。

あなたは、共通のクロスプロセスのメモリ空間が必要な場合は、「メモリマップ」や他の手段を使用する必要があり、これらのトピックは、学ぶ必要があります 学習。



コンセプトの概要:物理メモリ、仮想メモリは、仮想アドレステーブルの
機能GlobalMemoryStatusは、取得TMemoryStatus構造上の情報を得ることができます。


:// TMemoryStatusは_MEMORYSTATUSがリネームされ
_MEMORYSTATUS = レコード 
  {構造長}; DWORD:ザdwLengthを
  dwMemoryLoad:DWORD; {割合で使用されるメモリの整数を表す} 
  dwTotalPhys:DWORDを、物理メモリの合計{} 
  dwAvailPhys:DWORD; {使用可能な総物理メモリ} 
  dwTotalPageFile:DWORD; {仮想メモリの合計} 
  dwAvailPageFile:DWORD; {}仮想メモリの利用可能な総数
  dwTotalVirtual:DWORD; {}仮想アドレステーブルのアドレスの総数
  dwAvailVirtual:DWORD; {利用可能な仮想アドレステーブルのアドレスの総数} エンド

小さなプログラムメモリ条件であることを見て:


ユニット Unit1は、インタフェースが使用する 
  Windowsの、メッセージ、sysutilsの、バリアント、クラス、グラフィックス、コントロール、フォーム、
  ダイアログ、StdCtrls; 入力 
  TForm1 = クラス(TFormは)
    MEMO1:TMemoオブジェクトを、手順 FormCreate(送信者:TObjectを);
  エンド ; VAR 
  をForm1:TForm1; 実装 
{$のR * .DFM} 手順 TForm1.FormCreate(送信者:TObjectを)。
VaRの 
  M:TMemoryStatus。const 
  NUM = 1024 * 1024; 開始 
  GlobalMemoryStatus(m)を、
  Memo1.Clear; Memo1.Linesが行う始まります






    









   
    追加(フォーマット( 'dwLength:' +#9 + '%d'を、[m.dwLength])); 
    追加(フォーマット( 'dwMemoryLoad:' +#9 + '%d'を、[m.dwMemoryLoad])); 
    (フォーマット( 'dwTotalPhys:' +#9 + '%dの'、[m.dwTotalPhys追加のdiv NUM]を)); 
    (フォーマット( 'dwAvailPhys:' +#9 + '%dの'、[m.dwAvailPhys追加のdiv NUM]を)); 
    (フォーマット( 'dwTotalPageFile:' +#9 + '%dの'、[m.dwTotalPageFile追加DIV NUM])); 
    (フォーマット( 'dwAvailPageFile:' +#9 + '%dの'、[m.dwAvailPageFile追加DIV NUM])); 
    追加(フォーマット( 'dwTotalVirtual:' +#9 + '%dの'、[m.dwTotalVirtual DIV NUM])); 
    「((書式を追加エンド ;
エンド ; 終わり


私は、レンダリングを実行するためにここにいます:


 レッスン2:

次のような優れたメモリの分布に関する声明では静的な配列、


VAR 
  ARR1の:配列 [0..255] シャア、
  ARR2である:配列 [0..255] 整数;
 始める 
  ShowMessageFmt( '配列のサイズは次のとおり%のDは、%D'、 〔にSizeOf(ARR1)にSizeOf(ARR2 )]); 
  {アレイサイズである:512、1024} エンド


宣言時にメモリを割り当てるが、ポインタの設定数が割り当てられるどのくらいのメモリでなければならないが、静的配列ポインタのため、

このような場合に、我々は、割り当てるべきであり、新規でメモリを解放し、このような廃棄します。


入力 
  TArr1 = 配列 [0 255] チャーを、
  TArr2 = 配列 [0 255] 整数であり;
 VAR 
  ARR1の:^ TArr1; 
  ARR2は:^ TArr2; 始める 
  (ARR1の)新を、
  新しい(ARR2である)、
  ARR1の^: = 'Delphiのブログの場合'; 
  ShowMessageFmt( '%のSの%のS'、[^ ARR1の[0]、ARR1の^ [1]]); {}の場合
// ShowMessageFmt( '%のSの%のS'、[ARR1の[0]、ARR1 [1] ]); { これもでき} 
  ARR2は(ARR2はローである[^)]:低=(整数);第一{最小}構成要素
  ARR2は(ARR2はハイです[^)]:= MAXINT; {素子は第1の最大値を形成する} 
  ShowMessageFmt( '%のDは、%D' [ARR2 [0]、ARR2は[255]である]); {-2147483648、2147483647} 
  (ARR1の)廃棄し、
  廃棄(ARR2です)。エンド ;






//一見の仕事は、この例では、再びそれを行う:タイプ 
  TArr1は= 配列 [0..255] チャー; 
  TArr2 = アレイ [0..255]  ;整数
  PArr1 = ^ TArr1; 
  PArr2 = ^ TArr2; VAR 
  ARR1の:PArr1 ; 
  ARR2は:PArr2; 始める 
  (ARR1の)新しい、
  新規(ARR2である); 
  ARR1 ^の:; = 'Delphiのブログの場合' 
  ([ARR1の【のARR1の[0]、1]] '%S%S')ShowMessageFmt。
  ; =低(整数):ARR2は[低(ARR2は^である)] 
  [(ARR2は^である)高] ARR2である:= MAXINT; 
  ShowMessageFmt( '%のDは、%D' [ARR2 [0]、ARR2は[255]です])。 -2147483648 {、} 2147483647 
  (ARR1の)廃棄し、
  廃棄(ARR2である); エンド ;








新を使用すべきで割り当てられたメモリの既知のサイズに、上記の例では、あまりにも、後述するように、ポインタの静的配列、ポインタ構造(レコード)に関連している。

エッセンス新GetMemも呼び出し機能が、我々は指定する必要はありません。サイズ

:などが、ダイナミックアレイは不適切であるが、動的メモリアレイはsetLengthが十分でなければならない割り当てることの、


VaRの 
  ARR:配列 整数;
開始 
  はsetLength(ARR、3)。

  ARR [0]:=ランダム(100)。
  ARR [1]:=ランダム(100)。
  ARR [2]:=ランダム(100)。

  ShowMessageFmt( '%のDは、%D、%のD'、[ARR [0]、ARR [1]、ARR [2])。{0,3,86} の端部


ポインタの動的配列にメモリを割り当てるためにどのように?実際には、動的配列変数自体がポインタである、ポインタを取得するためにそれを与えるためにここに回るません。

しかし、重要なの完全な概念は、我々が型なしを置くことができることを、まだあります例えばダイナミック型の配列へのポインタ。


入力 
  ター= 配列 、整数
 のvar 
  P:ポインタ; 始める 
  GetMem(P ,. 3 *にSizeOf(整数)); {整数の空間3を収容するために割り当てられ} 
  {3つの要素のこのターのサイズは、同じであるのが、データ型の変換}使用
  [0]ター(P)を:ランダム(100)=; 
  ター(P)[1]:ランダム(100)=; 
  ター(P)は、[2]:ランダム(100)=; 
  ShowMessageFmt ( '%のD、%のD、Dの%'、[ター(P)[0]、ター(P)[1]、ター(P)[2]]); {0,3,86} 
  FreeMemの(P) ; エンド ;






GetMemとFreeMemのは、ここではより一般的に使用される型なしポインタの割当使用;例えばすることができる指標の他の種類ではなく、必ずしも最良の解決策を、。


//(以前StrAllocが良いと述べたと同様に、明らかに良くない)ウィンドウタイトルを取得
 するvar 
  ;ポインタ:P 始める 
  GetMem(P、256); 
  GetWindowText(ハンドル、P、256); 
  ShowMessage(PChar型(P));} {Form1]を
  FreeMemの(P); エンド ;



:それはのような、GetMemory FreeMemory GetMem、FreeMemの推進により、交換する必要があります


VARの 
  P:ポインタ; 開始 
  Pを:= GetMemory(256)。
  GetWindowText(ハンドル、P、256)。
  ShowMessage(PChar型(P))。{をForm1} 
  FreeMemory(P)。エンド ;



:最初の要約で
新規に割り当てられたメモリの既知のサイズへのポインタです;
; GetMem主に型なしポインタにメモリを割り当てるために
GetMemory代わりGetMemを利用するように。

そこAllocMemそれらであり、それはどのような違いを生むのでしょうか?

また、AllocMem後にメモリを割り当てます(空の)初期化され、GetMemは、まず次の検証、ではありません。


VaRの 
  P1、P2:ポインタ; 始める 
  P1:= AllocMem(256); 
  ShowMessage(PChar型(P1)); {空現れる} 
  freeMemory(P1); 
  P2:= GetMemory(256); 
  ShowMessage(PChar型(P2) ); {いくつかのゴミデータがここに表示され、コンテンツが以前に割り当てられたアドレスの内容に依存} 
  freeMemory(P2); エンド




FreeMemoryとFreeMemの違いについて:
1、FreeMemoryチェックはその後、少し似てFreeMemの、nilである:無料破棄して、
2、解放するメモリのサイズを指定するためのデフォルトのパラメータがあり、それはすべてのFreeMemのリリースを指定していない(する必要はありません)それの一部のみをリリース;
... 3、新規のDisposeの対応もFreeMemのかFreeMemory場所で使用すること

。,, GetMemを解放するために使用FreeMemoryを作るために、GetMemory AllocMemメモリReallocMem、ReallocMemory分布を

ReallocMem、ReallocMemoryメモリの基本は上に割り当てられています:再割り当てメモリ、タリアはほとんどReallocMemory nilをReallocMem判断より1である、などのReallocMemoryそれを使用してみてください


入力 
  ターを= 配列 [0..MaxListSize] チャー。
  幼魚= ^ター; VaRの 
  ARR:パー。
  I:整数; 開始 
  ARRを:= GetMemory(5)。ため = 0:私 4が行う [I] ARR:= chrです(65 + I)。
  ShowMessage(PChar型(ARR))。{ABCDE} 
  ARR = ReallocMemory(ARR、26)。
  ShowMessage(PChar型(ARR))。{} ABCDE  I:= 0  25 ない ARR [I]:= chrです(65 + I)。
  ShowMessage(PChar型(ARR))。{ABCDEFGHIJKLMNOPQRSTUVWXYZ} エンド


  

  


これは十分に可能性のアレイが、一般的ではないすべての使用を残し、この例十分大きなアレイとして定義されている種類以上のターは、ことに注意してください
我々は、一般的にのみポインタのような配列を使用し、そうでなければ初期化メモリ不足とクラッシュします。
自分の手を用いても、また新しい初期設定にすることができます旅行、GetMem、GetMemory、AllocMem、ReallocMem、使用する必要があります ReallocMemoryのようにどのくらいのようなアプリケーションの数で
も再割り当てられたメモリであってもよいし、注意すべきですより多くのポイント、より少ない;。より多くのポイントは、より以前のデータの存在を保証することができるはず場合
のTListクラスで使用されるこのコンセプトVCLを。

あなたが実際に大きな配列(、すべての権利、どれだけの心のポインタ我々がいることを受け入れることができない場合は?唯一のポインタ)、これは次のようになります。


入力 
  ターを= 配列 [0..0] チャー。
  幼魚= ^ター; VaRの 
  ARR:パー。
  I:整数; 開始 
  ARRを:= GetMemory(5)。ため = 0:私 4が行う [I] ARR:= chrです(65 + I)。
  ShowMessage(PChar型(ARR))。{ABCDE} 
  ARR = ReallocMemory(ARR、26)。
  ShowMessage(PChar型(ARR))。{} ABCDE  I:= 0  25 ない ARR [I]:= chrです(65 + I)。
  ShowMessage(PChar型(ARR))。{ABCDEFGHIJKLMNOPQRSTUVWXYZ} エンド


  

  

 
これは、あなたが行うことができる唯一の配列要素があり、不可解なように見えた?
それが理解されなければならない:これは、それが十分な大きさと出発点のパターンとを示すデータのデータ要素のあるただ一つの要素である

SysGetMem、SysFreeMem、SysAllocMem、SysReallocMem 4の追加をこの関数は、Delphiのデフォルトのメモリマネージャの場合には、我々はまだそれらを直接使用していない、これらの機能の基礎となる実装を超えるべきです。

 

仕事の愛、愛の生活、文学の愛

おすすめ

転載: www.cnblogs.com/h2zZhou/p/11588832.html
おすすめ