在Delphi中该函数VirtualAlloc用来保留虚拟页。实现在调用线程的虚地址空间中保留或提交一个页区域。<br>如果你不使用VirtualLock就不会把过程地址空间中的指定区域封锁在内存中。被保存的内存其它应用程序<br>无法使用并不是绝对的,利用VirtualFree就可以释放或收回该空间。你可以通过指针读取修改其中的内容。<br>//使用VirtualAlloc可以保存一定的内存,但是这和分配又有什么本质的区别呢?<br>没有区别,起码我是这么认为,虚存的分配本就是通过VirtualAlloc函数来完成。一段虚拟内存在申请后并<br>不能马上使用,如果要使用必须先提交,并且在提交时指定内存的保护方式。<br>//实际分配的过程则会慢一些<br>至于速度问题确实存在,进行分配操作往往会造成速度的减慢,例如没有空闲块。或者频繁的分配和重分配<br>都会造成速度减慢。但最关键在于竞争问题,如当两个或多个线程同时访问数据,而且在一个线程继续进行之<br>前必须等待另一个线程完成时就发生竞争。当大量使用内存块或DLL以多线程方式运行时将导致速度减慢。<br>竞争是在分配和释放操作中产生导致速度减慢的问题,在多任务中很难十全十美的解决!<br><br>Delphi中例子:<br>const <br> BlockCode: array [1..2] of Byte = ($59, $E9); <br> PageSize = 4096; <br>var <br> Block: PInstanceBlock; <br> Instance: PObjectInstance; <br>begin <br> if InstFreeList = nil then <br> begin <br> Block := VirtualAlloc (nil, PageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); <br> Block^.Next := InstBlockList; <br> Move(BlockCode, Block^.Code, SizeOf(BlockCode)); <br> Block^.WndProcPtr := Pointer(CalcJmpOffset(@Block^.Code[2], @StdHookProc)); <br> Instance := @Block^.Instances; <br> repeat <br> Instance^.Code := $E8; <br> Instance^.Offset := CalcJmpOffset(Instance, @Block^.Code); <br> Instance^.Next := InstFreeList; <br> InstFreeList := Instance; <br> Inc(Longint(Instance), SizeOf(TObjectInstance)); <br> until Longint(Instance) - Longint(Block) >= SizeOf(TInstanceBlock); <br> InstBlockList := Block <br> end; <br> Result := InstFreeList; <br> Instance := InstFreeList; <br> InstFreeList := Instance^.Next; <br> Instance^.Method := Method <br>end;