Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 9
На сайте нет зарегистрированных пользователей

Пользователей: 13,364
новичок: eqvufy
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Программа тестирования (тест) - вступительные экзамены (математика, физи...
Диплом - база данных поставщиков на Delphi (MS Sql Server)+ Пояснительна...
Моделирование работы обрабатывающего участка цеха в GPSS

Динамические массивы


Тем кто программировал в Basic, а затем перешел к Pascal, вероятно, доставляло неудобство отсутствие динамических массивов. Нет их и в ранних версиях Delphi , но ООП позволяет определить класс объектов, почти столь же удобных как и обычные массивы в Pascal, только динамических, т.е. таких, размер которых может изменяться в процессе работы программы. Вот объявление динамического массива целых:
Динамические массивы
Что мы хотим от такого массива? Во–первых, хорошо чтобы всегда получался 0 при чтении несуществующего элемента. Во–вторых, если число записывается за пределы массива, пусть массив расширяется до нужного размера и сохранят значение. Наконец, нужно уметь изменить размер массива явно.
Для явного задания начального размера массива в конструктор включён параметр N.

В конструкторе использована удобная функция работы с динамической памятью AllocMem. Она выделяет память нужного размера, заполняет ее нулями и возвращает указатель.

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

Расширение массива — трудоемкая операция. В SetE, чтобы массив работал эффективно, применены два характерных приема оптимизации таких действий. Основные затраты при изменении текущего размера связаны с обращением к системе за дополнительной памятью и с копированием текущего массива на новое место. Чтобы сократить количество обращений, используется “страничное выделение памяти”.
Из практики замечено, что если понадобился массив больше существующего на один элемент, весьма вероятно, что понадобится увеличить его и на два и на три. В этом случае, целесообразно при первом же обращении увеличить размер массива сразу на целый блок — страницу. Это и есть первый прием, позволяющий сократить количество обращений к системе в несколько раз. В нашем примере размер страницы определен константой Q и равен 16.
Второй прием связан с функцией ReAllocMem. Это системная утилита, позволяющая эффективно изменять текущий размер блока памяти. Если возможно, она стремиться увеличить блок без перемещения, просто добавив в конец необходимое количество памяти. Только если память в конце блока занята другими данными, функция выделяет память в другом месте, копирует содержимое массива на новое место, освобождает прежний блок памяти и возвращает указатель на новое место. Таким образом, количество копирований массива существенно сокращается по сравнению с грубой схемой, в которой оно выполняется каждый раз.
Ещё одна маленькая хитрость состоит в том, что массив расширяется только для запоминания ненулевых значений. Ведь при чтении ноль получится даже для отсутствующих элементов.
Следующий метод Resize помогает пользователю нашего класса ещё больше повысить эффективность. Если размер массива выяснился в ходе работы программы, тогда, задав его явно, программист получит объект по быстродействию мало отличающийся от обычного статического массива.

Как видно из деструктора, ReAllocMem позволяет не только получать, но и освобождать выделенную память. Вот пример работы с объектом нашего класса:
Динамические массивы
Обратите внимание, что синтаксически использование нашего массива очень сходно с обычным. Этой наглядности помогло добиться свойство Vect принятое по умолчанию.
Опубликовал Kest June 21 2011 13:37:35 · 0 Комментариев · 11245 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
DAlarm
PHP 5
iChat v.7.0 Final...
Crystal Button
JanButtonsV
Abbrevia
Ics
Rss Parser
CoolControls v3.0...
Preview
Ehlib
ЯЗЫК ПРОГРАММИРОВ...
WebReg v1.3
StartMark
PCX
Battle.Net - мони...
DragMe [Исходник ...
DateEdit
База англоязычных...
Библия хакера 2 К...

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97832
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10290
Turbo Pascal fo... 7373
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Изучение сложных б...
Too many open files
Какая разница межд...
Математические фун...
13-5)
Организация информ...
Раздел описания ме...
Терминалы телефонн...
Canon 1210 картридж
Самоуправление или...
Первое знакомство
Лабораторное занят...
Too many symbols
Обновление плагинов
Другие вариации фи...
Обратная связь
Множественные инте...
Выбор наилучших ал...
10 минут для SEO (...
почтовым сервером,...
14.6. Задачи
если удалить строк...
Шаблоны и... шаблоны
Содержимое базы LS...
Венгерский язык. М...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?