Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Частый вызов SetLength(Count+10)


Страницы:   1 2

@!!ex ©   (2007-12-02 19:18:00) 

Может ли вызвать ошибку?
Просто есть контейнер, доюалвение в который реализовано так:
procedure TNoise.Add(Position:TVector; LifeTime:integer; bSize:single; Const Color:TVector);
begin
 inc(Count);
 if Count>Size then begin
   inc(Size,500);
   SetLength(Items,Size);
 end;
 Items[Count-1]:=TWaterNoise.Create(Position,LifeTime,bSize,Color);
end;

И при этом в него засовывается около 500 объектов.
Проект начал падать, есть основания полагатЬ, что ошибка в контейнере.
Но там ничего страшщного не происходит, кроме такого фигового ресайза массива.


Сергей М.   (2007-12-03 10:38:00) [21]


> MBo ©   (03.12.07 10:30) [12]


D7 - полет нормальный.


MBo   (2007-12-03 10:30:00) [22]

В BDS2006 сей код отрабатывает без проблем - линейный рост занимаемой процессом памяти, а вот в старых версиях, насколько я помню, менеджер памяти мог не успевать, и рост квадратичный, пока не кончится память. Кто-нибудь проверит на 5-6-7?


procedure TForm2.Button8Click(Sender: TObject);
var
 i, s: Integer;
 a: array of Integer;
begin
 s := 0;
 for i := 1 to 100000000 do begin
   SetLength(a, i);
   s:= s + a[0];
 end;
 Caption := IntToStr(s);
end;


Leonid Troyanovsky   (2007-12-03 09:57:00) [23]


> Riply ©   (03.12.07 09:45) [10]

> Но тогда виноват не бедный SetLength, а не совсем правильная
> работа с памятью.

Тогда тяжкие обвинения лягут на дельфийский менеджер памяти :)
Скорее всего, автор чего-то не договаривает,
может он, например, потоки использует.

--
Regards, LVT.


Riply   (2007-12-03 09:45:00) [24]

> [8] Сергей М. ©   (03.12.07 09:38)

Спасибо.
Но тогда виноват не бедный SetLength, а не совсем правильная работа с памятью.
Так что с него можно снять такие тяжкие обвинения :)


Сергей М.   (2007-12-03 09:38:00) [25]


> дефрагментации


К фрагментации, конечно же)


Сергей М.   (2007-12-03 09:38:00) [26]


> Riply ©   (03.12.07 09:32) [7]


Все просто - частое перераспределение памяти ведет к ее дефрагментации, если менеджер памяти не поддерживает (или не полной мере поддерживает) сборку мусора.


Riply   (2007-12-03 09:32:00) [27]

> [5] Сергей М. ©   (03.12.07 09:05)
> Может.

Я понимаю, что "краткость - сестра" :),
но все таки, можно по-подробнее ?


Slym   (2007-12-03 09:13:00) [28]

добавление простое и в нем ошибки нет... а вот удалении смотреть нужно, т.к там не все просто и гладко


Сергей М.   (2007-12-03 09:05:00) [29]


> Может ли вызвать ошибку?


Может.


Правильный_Вася   (2007-12-02 20:30:00) [30]

я когда-то в Д5 сталкивался с проблемами дин массивов
если добавлять мелкими порциями много тысяч элементов, то иногда на AV выпадал
TList не имеет такой бяки


@!!ex   (2007-12-02 20:00:00) [31]

> [2] Amoeba ©   (02.12.07 19:41)

То что я не знал о его существовании, когда писал все это.
Сейчас переделывать поздно, ибо завтра сдавать готовый проект надо.


Amoeba   (2007-12-02 19:41:00) [32]

А какой смысл использовать динамический массив объектов вместо TObjectList?


@!!ex   (2007-12-02 19:19:00) [33]

опечатка.
inc(Size,10);


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо