Сделать константные буфера.
Которые пишутся только при чтении из файла. А потом "закрываются" через VirtualProtect.
Чтобы пользователь буфера не смог его испортить.
По аналогии с sharedConstString.
Типа:
var
Buffer : TBuffer;
Processor: TSomeMemPoolProcessor;
aStream: IStream;
While true do
Buffer := TBuffer.Create(aStream);
// - создаётся буфер с фреймом из файла.
// там внутри VirtualAlloc и VirtualProtect.
// которые делают mem_readOnly
If Buffer = nil then Exit;
// - если ничего не прочитали, то выходим
Processor.DoBuffer(Buffer.AsPointer);
// - там буфер доступен только на чтение
Buffer.Free;
// - освобождаем буфер
end;// - переходим к следующему фрейму
Там естественно try..finally, чтобы буфер не тёк.
Которые пишутся только при чтении из файла. А потом "закрываются" через VirtualProtect.
Чтобы пользователь буфера не смог его испортить.
По аналогии с sharedConstString.
Типа:
var
Buffer : TBuffer;
Processor: TSomeMemPoolProcessor;
aStream: IStream;
While true do
Buffer := TBuffer.Create(aStream);
// - создаётся буфер с фреймом из файла.
// там внутри VirtualAlloc и VirtualProtect.
// которые делают mem_readOnly
If Buffer = nil then Exit;
// - если ничего не прочитали, то выходим
Processor.DoBuffer(Buffer.AsPointer);
// - там буфер доступен только на чтение
Buffer.Free;
// - освобождаем буфер
end;// - переходим к следующему фрейму
Там естественно try..finally, чтобы буфер не тёк.
Проблема с накладными расходами на создание/удаление объектов в цикле - давным-давно решена.
ОтветитьУдалитьЧерез кеширование объектов а newInstance/freeInstance.
Ну и потом - TBuffer.Create - вообще может быть не конструтором, а фабрикой.
Удалить