Конференция "WinAPI" » GlobalReallocPtr. Правильно ли я понял ?
 
  • DevilDevil © (11.08.11 17:23) [0]
    Смотрю исходники TMemoryStream и понимаю что при релокации памяти они не используют стандартный менеджер памяти, а используют глобальный. Правильно ли я понимаю, что реаллок в данном случае почти бесплатный, потому что никаких копирований не делается, а тупо прибавляется страница памяти ?
  • DVM © (11.08.11 18:23) [1]

    > Смотрю исходники TMemoryStream и понимаю что при релокации
    > памяти они не используют стандартный менеджер памяти, а
    > используют глобальный.

    Где ты там это увидел то?
  • DVM © (11.08.11 18:24) [2]

    > DevilDevil ©   (11.08.11 17:23) 

    GetMem, FreeMem, ReallocMem - это функции менеджера памяти Delphi. Других функций в TMemoryStream  не вызывается.
  • DevilDevil © (11.08.11 19:48) [3]
    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
    {$IFDEF MSWINDOWS}
         GlobalFreePtr(Memory);
    {$ELSE}
         FreeMem(Memory);
    {$ENDIF}
         Result := nil;
       end else
       begin
    {$IFDEF MSWINDOWS}
         if Capacity = 0 then
           Result := GlobalAllocPtr(HeapAllocFlags, NewCapacity)
         else
           Result := GlobalReallocPtr(Memory, NewCapacity, HeapAllocFlags);
    {$ELSE}
         if Capacity = 0 then
           GetMem(Result, NewCapacity)
         else
           ReallocMem(Result, NewCapacity);
    {$ENDIF}
         if Result = nil then raise EStreamError.CreateRes(@SMemoryStreamError);
       end;
     end;
    end;

  • Loginov Dmitry © (11.08.11 21:26) [4]
    Код из 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
  • Сергей М. © (11.08.11 21:48) [5]

    > Правильно ли я понимаю, что реаллок в данном случае почти
    > бесплатный


    Правильно.
  • DVM © (11.08.11 22:42) [6]

    > DevilDevil ©   (11.08.11 19:48) [3]

    это какая версия Delphi? В новых как ты видишь убрали.
  • DevilDevil © (12.08.11 00:15) [7]
    > это какая версия Delphi? В новых как ты видишь убрали.
    D6/D7

    > Правильно.
    как вы думаете, имеет ли смысл делать GlobalReallocPtr в своей реаллок системе или всё же правильно использовать стандартный ReallocMem ?
  • DevilDevil © (13.08.11 01:18) [8]
    и ещё вопрос
    можно ли как-то оптимизировать выделение памяти на чтение или на запись ?
  • Германн © (13.08.11 01:25) [9]

    > DevilDevil ©   (13.08.11 01:18) [8]
    >
    > и ещё вопрос
    > можно ли как-то оптимизировать выделение памяти на чтение
    > или на запись ?

    Можно. Но зависит от задачи.
  • DevilDevil © (13.08.11 02:36) [10]
    Задача следующая
    необходимо записать много данных (не читать)

    а потом сохранить записываемое в произвольный Stream
  • DVM © (13.08.11 21:08) [11]

    >  много данных

    это сколько много? TFileStream бери если очень много.
  • DiamondShark © (15.08.11 13:16) [12]

    > необходимо записать много данных (не читать)
    > а потом сохранить записываемое в произвольный Stream

    Взаимоисключающие параграфы детектед.
    Как можно сохранить, не читая?


    > TFileStream бери если очень много.

    Лучше допилить TFileStream до использования
    FILE_ATTRIBUTE_TEMPORARY |
    FILE_FLAG_DELETE_ON_CLOSE
 
Конференция "WinAPI" » GlobalReallocPtr. Правильно ли я понял ?
Есть новые Нет новых   [134431   +10][b:0][p:0.003]