是否可以將內存映射文件包裝起來?使用內存映射文件實現虛擬內存
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
在這種情況下,您需要與此不同的界面。你需要一個能夠讓你通過地址空間限制的接口,但這不是。 –