是否可以将内存映射文件包装起来?使用内存映射文件实现虚拟内存
TVirtualMemoryManager = class
public
function AllocMem (Size : Integer) : Pointer;
procedure FreeMem (Ptr : Pointer);
end;
由于内存映射文件API函数全部取偏移量,我不知道如何管理内存映射文件中的空闲区域。我唯一的想法是实现某种基本的内存管理(维护不同块大小的免费列表),但我不知道这将是多么有效。
编辑:我真的想(大卫清楚地向我)是这样的:
IVirtualMemory = interface
function ReadMem (Addr : Int64) : TBytes;
function AllocateMem (Data : TBytes) : Int64;
procedure FreeMem (Addr : Int64);
end;
我需要的字节连续块(每个比较小)存储在虚拟内存中,并能够使用64位地址将它们读回到内存中。大部分时间访问是只读的。如果需要写入,我将仅使用FreeMem
,然后再使用AllocMem
,因为无论如何,大小都会有所不同。
我要为内存的封装映射文件与该接口。它在内部具有内存映射文件的句柄,并在每个ReadMem
请求上使用MapViewOfFile
。 64位整数只是内存映射文件的偏移量。一个悬而未决的问题是如何分配这些地址 - 我目前保留了我维护的空闲块列表。
“虚拟内存”是什么意思?系统已经为你做了。 –
我想绕过2/3/4 GB的内存限制,并希望由文件(本例中为页面文件)支持的虚拟内存。 – jpfollenius
在这种情况下,您需要与此不同的界面。你需要一个能够让你通过地址空间限制的接口,但这不是。 –