Сейчас на форуме: tyns777 (+5 невидимых)

 eXeL@B —› Программирование —› Динамические массивы в Delphi
Посл.ответ Сообщение

Ранг: 113.4 (ветеран)
Активность: 0.130
Статус: Участник
Ветеран

Создано: 21 января 2008 20:24
· Личное сообщение · #1

Здравствуйте!

Появился вопрос касательно работы динамических массивов в Delphi:
Заранее не известно сколько будет всего элементов, по мере чтения файла я узнаю сколько их будет. Т.е. нужно паралелно увеличивать кол-во эл-тов и запихивать туда содержимое. Почему так нужно, долго обьяснять...Собственно сам вопрос будет ли большая нагрузка если в пути чтения файла расширять динаический массив? Массивы в Delphi работают так же как и в Basic'е(насколько мне известно бэйсик делает так: при вызове redim создаёт новый массив нужной длинны, копирует эл-ты из старого(если требуется), уничтожает старый и мы пользуемся новым. Поправьте, если я не прав, пожалуйста.)?

-----
моя подпись!




Ранг: 51.7 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 21 января 2008 20:42
· Личное сообщение · #2

locker_fx Так делфи сама следит за массивом динамическим и расширяет\сужает при необходимости или запросах. Нагрузка зависит от характера твоего приложения, но думаю на современных мощностях вопрос твой отпадает.



Ранг: 88.3 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 21 января 2008 20:45
· Личное сообщение · #3

Это работает малость не так, динамический массив представляет из себя набор dword'ов - указатель в памяти гле содержатся данные этого елемента. Когда ты создаешь новый елемент, к общему списку указателей добавляется еще один и выделяется память равная размеру этого элемента.

Вообщем смотря сколько ты будешь обрабатывать данных, если массив длинной (не размером данных, а именно длинной), не больше 10000 элементов, то время его создания (досоздания) вообщем то незначительно, и почти незаметно.



Ранг: 210.5 (наставник), 2thx
Активность: 0.140
Статус: Участник

Создано: 21 января 2008 20:47 · Поправил: arnix
· Личное сообщение · #4

var Students : array of string;
...
SetLength(Students, 14) ;
...

Можно делать это не часто, тойсть добавить по 2000-3000 записей, каждый раз когда необходимо, но вот насколько это будет тормозить при больших значениях нужно тестить




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 21 января 2008 20:52
· Личное сообщение · #5

locker_fx пишет:
создаёт новый массив нужной длинны, копирует эл-ты из старого(если требуется), уничтожает старый и мы пользуемся новым.

Как-то страшно это звучит, не думаю, что всё так запущено...
Вот почитай: www.rsdn.ru/article/Delphi/dynarrays.xml

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 113.4 (ветеран)
Активность: 0.130
Статус: Участник
Ветеран

Создано: 21 января 2008 20:53
· Личное сообщение · #6

arnix пишет:
var Students : array of string;
...
SetLength(Students, 14) ;
...


Enigma пишет:
Вообщем смотря сколько ты будешь обрабатывать данных, если массив длинной (не размером данных, а именно длинной), не больше 10000 элементов, то время его создания (досоздания) вообщем то незначительно, и почти незаметно.

Хочется как можно сильнее оптимизировать...

-----
моя подпись!




Ранг: 113.4 (ветеран)
Активность: 0.130
Статус: Участник
Ветеран

Создано: 21 января 2008 21:04
· Личное сообщение · #7

Isaev пишет:
Как-то страшно это звучит, не думаю, что всё так запущено...

читай внимательнее! Я говорил не про Delphi а про Basic

Isaev пишет:
Вот почитай: --> Link <--

Зы. прикольно как раз нашёл эту ссыль в гугле

-----
моя подпись!





Ранг: 279.1 (наставник)
Активность: 0.160
Статус: Участник
wizard

Создано: 21 января 2008 22:56
· Личное сообщение · #8

locker_fx пишет:
Хочется как можно сильнее оптимизировать...


тогда уж пиши на asm

-----
Что один человек сделал , другой всегда сломать может...





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 21 января 2008 23:05
· Личное сообщение · #9

locker_fx пишет:
читай внимательнее! Я говорил не про Delphi а про Basic

ты говорил:
locker_fx пишет:
Массивы в Delphi работают так же как и в Basic'е


MACKLIA пишет:
тогда уж пиши на asm

+1

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 122.2 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 22 января 2008 03:31
· Личное сообщение · #10

А что за елементы то в массиве? объекты или записи или вообще простые типы. Возможно тут лучше TList подойдет. А вобще arnix правильо сказал: нужно изменять размер массива не каждый раз, а на каждые несколько элементов.




Ранг: 141.4 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 22 января 2008 09:44
· Личное сообщение · #11

В. Возможно создавать динамически-изменяющиеся массивы в Delphi?

О. Да. Для начала вам необходимо создать тип массива, использующего самый большой размер, который вам, вероятно, может понадобиться. В действительности, при создании типа никакой памяти не распределяется. Вот когда вы создаете переменную этого типа, тогда компилятор пытается распределить для вас необходимую память. Вместо этого создайте переменную, являющуюся указателем на этот тип. Этим вы заставите компилятор распределить лишь четыре байта, необходимые для размещения указателя.

Прежде, чем вы сможете пользоваться массивом, вам необходимо распределить для него память. Используя AllocMem, вы можете точно управлять выделяемым размером памяти. Для того, чтобы определить необходимое количество байт, которые вы должны распределить, просто умножьте размер массива на размер отдельного элемента массива. Имейте в виду, что самый большой блок, который вы сможете распределить в любой момент в 16-битной среде равен 64Kб. Самый большой блок, который вы можете в любой момент распределить в 32-битной среде равен 4Гб. Для определения максимального числа элементов, которые вы можете иметь в вашем конкретном массиве (в 16-битной среде), разделите 65,520 на размер отдельного элемента. Например: 65520 div SizeOf(LongInt)


дальше можно прочитать тут - --> Динамические массивы <-- http://www.delphihelp.org/dynamic_arrays2.html

думаю, что должно помочь.



Ранг: 113.4 (ветеран)
Активность: 0.130
Статус: Участник
Ветеран

Создано: 22 января 2008 15:33
· Личное сообщение · #12

MACKLIA пишет:
тогда уж пиши на asm

Боюсь замучаюсь! Не к чему такие само пожертвования. Asm - сила, но применять надо с умом.

Isaev пишет:
ты говорил:
locker_fx пишет:
Массивы в Delphi работают так же как и в Basic'е

Там после скобки стоит знак вопроса
Я как раз спросил массивы работают также или по другому.

intro пишет:
думаю, что должно помочь.

спасибо, пошёл курить!

-----
моя подпись!





Ранг: 279.1 (наставник)
Активность: 0.160
Статус: Участник
wizard

Создано: 23 января 2008 13:31
· Личное сообщение · #13

locker_fx пишет:
Боюсь замучаюсь! Не к чему такие само пожертвования.



locker_fx а что у тебя за задача такая ,что требуется именно ->
locker_fx пишет: как можно сильнее оптимизировать...
Я иногда вообще заместо динамического массива создавал массив ,количество элементов которого больше ,чем мне понадобится ,вот такой я лентяй

-----
Что один человек сделал , другой всегда сломать может...




Ранг: 19.1 (новичок), 4thx
Активность: 0.010
Статус: Участник

Создано: 23 января 2008 18:43
· Личное сообщение · #14

locker_fx, не стоит юзать SetLength(x, Length(x)+1). Лучше при добавлении в массив нового элемента проверять Length(x) и при необходимости вызывать SetLength(x, Length(x)+AddSize). Реальное кол-во элементов при этом лучше хранить в отдельной переменной.

Привыкай лучше к GetMem (+FastMM4). Мне нравиться самому вызывать FreeMem, чем на делфи надеяться.

И посмотри в делфи реализацию TList (вроде бы там для 16 указателей за раз память выделяется).



Ранг: 88.3 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 23 января 2008 19:06
· Личное сообщение · #15

OSA пишет:
Реальное кол-во элементов при этом лучше хранить в отдельной переменной.


ты видел как делфи организует чтение длинны динамического массива? Если взять указатель на массив и вычесть из него 4, в этой ячейке будет хранится размер! Использование своего счетчика - муторнее, и по скорости явно не быстрее!

OSA пишет:
И посмотри в делфи реализацию TList (вроде бы там для 16 указателей за раз память выделяется).

Так же как и динамический массив.



Ранг: 19.1 (новичок), 4thx
Активность: 0.010
Статус: Участник

Создано: 23 января 2008 20:18
· Личное сообщение · #16

Enigma пишет:
ты видел как делфи организует чтение длинны динамического массива? Если взять указатель на массив и вычесть из него 4, в этой ячейке будет хранится размер! Использование своего счетчика - муторнее, и по скорости явно не быстрее!

Если ты выделишь массив для 100 элементов, а реально будешь хранить в нём менее 100, где ты будешь хранить реальное число лементов ?
И не нужно тут базарить про внутренную организацию. И без тебя знаю.
И как же на скорость влияет дополнительный Integer (в котором будет храниться кол-во элементов) ?

Enigma пишет:
Так же как и динамический массив.

var
arr: array of Pointer;
begin
SetLength(arr, 1);

Ты полагаешь что выделиться память под 16 элементов, т.е. 64 байт ?


 eXeL@B —› Программирование —› Динамические массивы в Delphi
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати