Конференция "WinAPI" » Как избавиться от SetLength? [D7]
 
  • DVM © (27.04.13 21:14) [20]

    > хочу переписать Ваш код чисто на виньапишках.

    А что это даст? Какие преимущества?
  • RWolf © (27.04.13 22:15) [21]

    > DVM ©   (27.04.13 21:14) [20]

    телепатор подсказывает мне, что непрерывное расширение буфера последовательными вызовами SetLength забивает память дельфового менеджера кучи пустыми блоками, и программа падает с Out of memory.
    Вариант решения — хранить принятые данные фрагментами в односвязном списке, например.
  • Rouse_ © (27.04.13 23:11) [22]

    > RWolf ©   (27.04.13 22:15) [21]

    Хм, очень интересная подача :)
    Но как?
    При расширении буфера выйдем на реаллок, фрагментация то откуда? :)
  • RWolf © (28.04.13 01:42) [23]

    > Rouse_ ©   (27.04.13 23:11) [22]


    я хочу сказать, что в [0] мы видим не весь код, так что, возможно, реализуется ситуация наподобие такой:

    procedure TForm1.Button1Click(Sender: TObject);
    var i:Integer;
       s:string;
       a:array of string;
    begin
     for i:=1 to 100 do begin //падаем на 20-й итерации
       SetLength(s, 100000000 + 4*i);
       SetLength(a, Length(a)+1);
       a[High(a)]:=IntToStr(i);
     end;
    end;

  • Германн © (28.04.13 02:11) [24]

    > При расширении буфера выйдем на реаллок, фрагментация то
    > откуда?

    А есть ли в задаче автора возможность
    > Но выделить нужно сразу столько, сколько потребуется
    ?
    Иначе использование флага HEAP_REALLOC_IN_PLACE_ONLY просто вызовет ошибку. А тогда фрагментации избежать не удастся ровно также как и при использовании SetLength.

    P.S.
    Меня  больше смущает ответ автора:

    > с этим всё понятно, а вот полез в
    > procedure       _LStrSetLength{ var str: AnsiString; newLength:
    >  Integer};
    >
 
Конференция "WinAPI" » Как избавиться от SetLength? [D7]
Есть новые Нет новых   [119105   +99][b:0][p:0.001]