Сейчас на форуме: tyns777 (+5 невидимых) |
eXeL@B —› Программирование —› Динамические массивы в Delphi |
Посл.ответ | Сообщение |
|
Создано: 21 января 2008 20:24 · Личное сообщение · #1 Здравствуйте! Появился вопрос касательно работы динамических массивов в Delphi: Заранее не известно сколько будет всего элементов, по мере чтения файла я узнаю сколько их будет. Т.е. нужно паралелно увеличивать кол-во эл-тов и запихивать туда содержимое. Почему так нужно, долго обьяснять...Собственно сам вопрос будет ли большая нагрузка если в пути чтения файла расширять динаический массив? Массивы в Delphi работают так же как и в Basic'е(насколько мне известно бэйсик делает так: при вызове redim создаёт новый массив нужной длинны, копирует эл-ты из старого(если требуется), уничтожает старый и мы пользуемся новым. Поправьте, если я не прав, пожалуйста.)? ----- моя подпись! |
|
Создано: 21 января 2008 20:42 · Личное сообщение · #2 |
|
Создано: 21 января 2008 20:45 · Личное сообщение · #3 Это работает малость не так, динамический массив представляет из себя набор dword'ов - указатель в памяти гле содержатся данные этого елемента. Когда ты создаешь новый елемент, к общему списку указателей добавляется еще один и выделяется память равная размеру этого элемента. Вообщем смотря сколько ты будешь обрабатывать данных, если массив длинной (не размером данных, а именно длинной), не больше 10000 элементов, то время его создания (досоздания) вообщем то незначительно, и почти незаметно. |
|
Создано: 21 января 2008 20:47 · Поправил: arnix · Личное сообщение · #4 |
|
Создано: 21 января 2008 20:52 · Личное сообщение · #5 |
|
Создано: 21 января 2008 20:53 · Личное сообщение · #6 arnix пишет: var Students : array of string; ... SetLength(Students, 14) ; ... Enigma пишет: Вообщем смотря сколько ты будешь обрабатывать данных, если массив длинной (не размером данных, а именно длинной), не больше 10000 элементов, то время его создания (досоздания) вообщем то незначительно, и почти незаметно. Хочется как можно сильнее оптимизировать... ----- моя подпись! |
|
Создано: 21 января 2008 21:04 · Личное сообщение · #7 |
|
Создано: 21 января 2008 22:56 · Личное сообщение · #8 |
|
Создано: 21 января 2008 23:05 · Личное сообщение · #9 |
|
Создано: 22 января 2008 03:31 · Личное сообщение · #10 |
|
Создано: 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 думаю, что должно помочь. |
|
Создано: 22 января 2008 15:33 · Личное сообщение · #12 MACKLIA пишет: тогда уж пиши на asm Боюсь замучаюсь! Не к чему такие само пожертвования. Asm - сила, но применять надо с умом. Isaev пишет: ты говорил: locker_fx пишет: Массивы в Delphi работают так же как и в Basic'е Там после скобки стоит знак вопроса Я как раз спросил массивы работают также или по другому. intro пишет: думаю, что должно помочь. спасибо, пошёл курить! ----- моя подпись! |
|
Создано: 23 января 2008 13:31 · Личное сообщение · #13 locker_fx пишет: Боюсь замучаюсь! Не к чему такие само пожертвования. locker_fx а что у тебя за задача такая ,что требуется именно -> locker_fx пишет: как можно сильнее оптимизировать... Я иногда вообще заместо динамического массива создавал массив ,количество элементов которого больше ,чем мне понадобится ,вот такой я лентяй ----- Что один человек сделал , другой всегда сломать может... |
|
Создано: 23 января 2008 18:43 · Личное сообщение · #14 locker_fx, не стоит юзать SetLength(x, Length(x)+1). Лучше при добавлении в массив нового элемента проверять Length(x) и при необходимости вызывать SetLength(x, Length(x)+AddSize). Реальное кол-во элементов при этом лучше хранить в отдельной переменной. Привыкай лучше к GetMem (+FastMM4). Мне нравиться самому вызывать FreeMem, чем на делфи надеяться. И посмотри в делфи реализацию TList (вроде бы там для 16 указателей за раз память выделяется). |
|
Создано: 23 января 2008 19:06 · Личное сообщение · #15 OSA пишет: Реальное кол-во элементов при этом лучше хранить в отдельной переменной. ты видел как делфи организует чтение длинны динамического массива? Если взять указатель на массив и вычесть из него 4, в этой ячейке будет хранится размер! Использование своего счетчика - муторнее, и по скорости явно не быстрее! OSA пишет: И посмотри в делфи реализацию TList (вроде бы там для 16 указателей за раз память выделяется). Так же как и динамический массив. |
|
Создано: 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 |