Можно ли обернуть файлы, отображенные в память, примерно так?
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
, поскольку размер все равно будет другим.
Я хочу обертку для файла с отображением в памяти с этим интерфейсом. Внутренне он имеет дескриптор отображенных в память файлов и использует MapViewOfFile
при каждом запросе ReadMem
. Addr
64-битные целые числа просто смещаются в отображенный файл памяти. Открытый вопрос - как назначить эти адреса - в настоящее время у меня есть список свободных блоков, которые я поддерживаю.