すべてのコンパイラには、独自のメモリ管理システムがあります。正確に言えば、同じコンパイラで複数のMMを動作させることができます。アプリケーションの目的に応じて、使用するMMを選択できます。たとえば、サーバーではマルチスレッドスケーリングMMに興味があるかもしれませんが、シンプルなUIクライアントアプリケーションでは、MMを高速でメモリを消費しないようにしたいと考えています。
Windowsで提供される内部ヒープ管理は、すべてのコンパイラ/フレームワークが独自のメモリマネージャを実装するほど遅かった(少なくともXPまで)。
2006年以来、Delphiの「純粋なBorland」バージョンがあり、FastMM4という名前のオープンソースMMがメインの「Delphi」IDEに組み込まれました。
Delphiでは、メモリマネージャを簡単に変更できます。関数のレコードを作成した後、SetMemoryManager()を呼び出して、現在のMMを新しいものに置き換えます。例えば
、ここではデルファイのためのour Open Source scaling Memory Managerをインストールされている方法です。
{$if CompilerVersion >= 17}
{$define USEMEMMANAGEREX}
{$ifend}
var
{$ifdef USEMEMMANAGEREX}
OldMM: TMemoryManagerEx;
{$else}
OldMM: TMemoryManager;
{$endif}
const
{$ifdef USEMEMMANAGEREX}
ScaleMM_Ex: TMemoryManagerEx = (
GetMem: Scale_GetMem;
FreeMem: Scale_FreeMem;
ReallocMem: Scale_ReallocMem;
AllocMem: Scale_AllocMem;
RegisterExpectedMemoryLeak: Scale_RegisterMemoryLeak;
UnregisterExpectedMemoryLeak: Scale_UnregisterMemoryLeak);
{$else}
ScaleMM_Ex: TMemoryManager = (
GetMem: Scale_GetMem;
FreeMem: Scale_FreeMem;
ReallocMem: Scale_ReallocMem);
{$endif}
procedure ScaleMMInstall;
begin
// Hook memory Manager
GetMemoryManager(OldMM);
if @OldMM <> @ScaleMM_Ex then
SetMemoryManager(ScaleMM_Ex);
// init main thread manager
GlobalManager.Init;
このコードは、カスタムScale_GetMem
/Scale_FreeMem
/Scale_ReallocMem
/Scale_AllocMem
機能を経由して、私たち自身によるデルファイMMに置き換えられます。あなただけのOldMM
変数を使用することにより、古いMMへのラッパーを作ることができます:あなたは正しいものを選択することがありますので、
function Scale_GetMem(aSize: Integer): Pointer;
begin
// do some debugging here
result := OldMM.GetMem(aSize);
end;
MMのレコード構造は、時間に変更 - 私たちは、これがUSEMEMMANAGEREX
条件を使用して行います。
私はオプションを読んでいましたが、それは私にそれを外部的に接続するオプションを与えていないことに気づいた。私が間違っている? –
私はあなたが外部に引っ掛けることによって何を意味するか分かりません。実行中の別のプログラムを調べることを意味しますか?おそらく、WOW64のようなエミュレータのようなデバッグツールを実行する方が良いでしょう(例:[link] http://msdn.microsoft.com/en-us/library/aa384249%28v=VS.85%29.aspx)。 Windowsのデバッグツールなどを使用します。 –