Форум: "Прочее";
Текущий архив: 2012.03.25;
Скачать: [xml.tar.bz2];
ВнизTList vs TList<T> Найти похожие ветки
← →
Jeer © (2011-11-30 15:51) [0]По мотивам, ху из круче :)
1. TList расширяется так и только при fCount = fCapacity, т.е. не при каждом *.Add:
procedure TList.Grow;
var
Delta: Integer;
begin
if FCapacity > 64 then
Delta := FCapacity div 4
else
if FCapacity > 8 then
Delta := 16
else
Delta := 4;
SetCapacity(FCapacity + Delta);
end;
2. TList - это ни разу не динамический массив, а имеет свой аллокатор в raw-памяти без какой-либо инициализации аллокированного пространства.
**********************
TList<T> - имеет в себе динамический массив, что предопределяет вид аллокации.
Grow выполняется методом SetLength на 50% от текущей Capacity, т.е. более "жаден".
***********************
Делались практические замеры - TList выигрывает на Add().
← →
Сергей М. © (2011-11-30 15:55) [1]
> TList выигрывает на Add().
Кому шашечки, кому ехать - на всех ведь не угодишь)
Ты это не в связи ли с топиком про ScaleMM2 ?
← →
Jeer © (2011-11-30 15:59) [2]
> Сергей М. © (30.11.11 15:55) [1]
Не, мы с Ega23 увлеклись энтим обсуждением в
http://delphimaster.net/view/2-1322608424/
и не заметили, как нас прикрыли :)
← →
Rouse_ © (2011-11-30 16:21) [3]TList быстрее TList<T> примерно в 2 раза...
← →
clickmaker © (2011-11-30 16:23) [4]> TList быстрее TList<T> примерно в 2 раза
странно только то, что это вызывает какие-то сомнения )
← →
Jeer © (2011-11-30 16:29) [5]
> clickmaker © (30.11.11 16:23) [4]
>
> > TList быстрее TList<T> примерно в 2 раза
>
> странно только то, что это вызывает какие-то сомнения )
Так я только отвечал Ega23, что сомнений быть не должно.
Опять Rouse_ недочеты ученика проморгал :).
← →
Rouse_ © (2011-11-30 16:50) [6]Вон Jack128 тут подсказывает что при правильно выставленном Capacity не в два, а минимум в 8 раз :)
← →
Rouse_ © (2011-11-30 16:50) [7]
> Jeer © (30.11.11 16:29) [5]
> Опять Rouse_ недочеты ученика проморгал :).
Че эт ученика, Легыч сам по себе, он дженерики кстати лучше меня знает :)
← →
Jeer © (2011-11-30 17:00) [8]
> Rouse_ © (30.11.11 16:50) [7]
> Че эт ученика, Легыч сам по себе,
Ну так, слегка "подцепил" :)
← →
Ega23 © (2011-11-30 17:13) [9]
> Так я только отвечал Ega23, что сомнений быть не должно.
>
> Опять Rouse_ недочеты ученика проморгал :).
Ты кажется малость недопёр:
Jeer © (30.11.11 09:51) [8]
Дженерики ( обобщения ).
Обычный TList - список указателей.
Обобщения позволяют создавать список оговоренного типа данных.
В данном случае - список integer ( аля дин. массив ).
Ega23 © (30.11.11 10:37) [9]
Собственно, это и есть дин.массив, просто он в привате сидит и реаллок несколько иначе реализован.
Jeer © (30.11.11 11:58) [10]
Да.
+ медленнее за счет более "жадного" алгоритма реаллока.
Ega23 © (30.11.11 12:05) [11]
Наоборот, быстрее. Прирост размера 25% сразу. Но - по одному разу, а не на каждой итерации SetLength делать.
Я вообще-то про дин.массив vs. TList<T> при заранее неизвестном размере.
Приращение на 25% - согласен, это я с TList спутал.
← →
Dennis I. Komarov © (2011-11-30 17:14) [10]
> Вон Jack128 тут подсказывает
Да у вас там банда :)
← →
DVM © (2011-11-30 17:37) [11]
> Jeer © (30.11.11 15:51)
> 2. TList - это ни разу не динамический массив, а имеет свой
> аллокатор в raw-памяти без какой-либо инициализации аллокированного
> пространства.
теперь уже динамический массив (XE2)
TPointerList = array of Pointer;
TList = class(TObject)
private
FList: TPointerList;
FCount: Integer;
← →
Dennis I. Komarov © (2011-11-30 17:39) [12]
ARec = record
a:
s:
d:
end;
G = TList<ARec>;
AClass = class(Object)
private
FAny: G;
public
property A: G read FAny;
...
end;
Поправьте если не так понял:
Если раньше TList - список указателей и при удалении указателя из списка нужно было самому следить (освобождать) за памятью по этому указателю (PRec), то теперь указав TList<ARec> получаем список ARec-ов и уже с памятью делать ничего не нужно. TList<ARec>.Delete(Index) сам все сделает, Ровно как и TList<ARec>.Free
← →
Dennis I. Komarov © (2011-11-30 17:57) [13]
> DVM © (30.11.11 17:37) [11]
> теперь уже динамический массив (XE2)
>
> TPointerList = array [...] of Pointer;
>
> TList = class(TObject)
> private
> FList: PPointerList;
но сути не меняет... (D2010)
← →
Jeer © (2011-11-30 18:25) [14]
> теперь уже динамический массив (XE2)
>
"Ну только отвлечешься, опять все испортят" (С)
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2012.03.25;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c