-
Смотрю исходники TMemoryStream и понимаю что при релокации памяти они не используют стандартный менеджер памяти, а используют глобальный. Правильно ли я понимаю, что реаллок в данном случае почти бесплатный, потому что никаких копирований не делается, а тупо прибавляется страница памяти ?
-
> Смотрю исходники TMemoryStream и понимаю что при релокации > памяти они не используют стандартный менеджер памяти, а > используют глобальный.
Где ты там это увидел то?
-
> DevilDevil © (11.08.11 17:23)
GetMem, FreeMem, ReallocMem - это функции менеджера памяти Delphi. Других функций в TMemoryStream не вызывается.
-
function TMemoryStream.Realloc(var NewCapacity: Longint): Pointer;
begin
if (NewCapacity > 0) and (NewCapacity <> FSize) then
NewCapacity := (NewCapacity + (MemoryDelta - 1)) and not (MemoryDelta - 1);
Result := Memory;
if NewCapacity <> FCapacity then
begin
if NewCapacity = 0 then
begin
GlobalFreePtr(Memory);
FreeMem(Memory);
Result := nil;
end else
begin
if Capacity = 0 then
Result := GlobalAllocPtr(HeapAllocFlags, NewCapacity)
else
Result := GlobalReallocPtr(Memory, NewCapacity, HeapAllocFlags);
if Capacity = 0 then
GetMem(Result, NewCapacity)
else
ReallocMem(Result, NewCapacity);
if Result = nil then raise EStreamError.CreateRes(@SMemoryStreamError);
end;
end;
end;
-
Код из D2010: function TMemoryStream.Realloc(var NewCapacity: Longint): Pointer;
begin
if (NewCapacity > 0) and (NewCapacity <> FSize) then
NewCapacity := (NewCapacity + (MemoryDelta - 1)) and not (MemoryDelta - 1);
Result := Memory;
if NewCapacity <> FCapacity then
begin
if NewCapacity = 0 then
begin
FreeMem(Memory);
Result := nil;
end else
begin
if Capacity = 0 then
GetMem(Result, NewCapacity)
else
ReallocMem(Result, NewCapacity);
if Result = nil then raise EStreamError.CreateRes(@SMemoryStreamError);
end;
end;
end; Нет там никаких GlobalFreePtr
-
> Правильно ли я понимаю, что реаллок в данном случае почти > бесплатный
Правильно.
-
> DevilDevil © (11.08.11 19:48) [3]
это какая версия Delphi? В новых как ты видишь убрали.
-
> это какая версия Delphi? В новых как ты видишь убрали. D6/D7
> Правильно. как вы думаете, имеет ли смысл делать GlobalReallocPtr в своей реаллок системе или всё же правильно использовать стандартный ReallocMem ?
-
и ещё вопрос можно ли как-то оптимизировать выделение памяти на чтение или на запись ?
-
> DevilDevil © (13.08.11 01:18) [8] > > и ещё вопрос > можно ли как-то оптимизировать выделение памяти на чтение > или на запись ?
Можно. Но зависит от задачи.
-
Задача следующая необходимо записать много данных (не читать)
а потом сохранить записываемое в произвольный Stream
-
> много данных
это сколько много? TFileStream бери если очень много.
-
> необходимо записать много данных (не читать) > а потом сохранить записываемое в произвольный Stream
Взаимоисключающие параграфы детектед. Как можно сохранить, не читая?
> TFileStream бери если очень много.
Лучше допилить TFileStream до использования FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE
|