Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Языки программирования -> Кубенский А.А. -> "Структуры и алгоритмы обработки данных. Объектно-ориентированный подход и реализация на C++" -> 100

Структуры и алгоритмы обработки данных. Объектно-ориентированный подход и реализация на C++ - Кубенский А.А.

Кубенский А.А. Структуры и алгоритмы обработки данных. Объектно-ориентированный подход и реализация на C++ — Спб.: БВХ-Петербург , 2004. — 464 c.
ISBN 5-94157-506-8
Скачать (прямая ссылка): strukturiialgoritmiobrabotkidannih2004.djvu
Предыдущая << 1 .. 94 95 96 97 98 99 < 100 > 101 102 103 104 105 106 .. 161 >> Следующая

В разд. 2.2 описывалась цифровая сортировка элементов массива (ключей), при которой требовалось многократно строить и уничтожать списки элементов массива. Конечно, можно было бы при добавлении каждого элемента в список отводить память под него с помощью оператора new, а когда элемент возвращался в массив освобождать отведенную под него память с помощью оператора delete. Однако такая реализация алгоритма имела бы очень небольшую скорость работы из-за частых вызовов сложных системных механизмов распределения памяти, да и количество фактически затрачиваемой памяти тоже было бы довольно большим, поскольку система всегда резервирует некоторое дополнительное количество памяти при каждом вызове оператора new ДЛЯ СВОИХ НуЖД.
Для реализации цифровой сортировки мы построили небольшую узкоспециализированную систему распределения памяти, которая отводила память под элементы списков внутри некоторого пула памяти. Обращение к встроенной системе распределения памяти при этом производилось только один раз, когда надо было отвести память под весь пул. В дальнейшем вся работа с элементами списков производилась нашей специализированной системой рас-
Алгоритмы распределения памяти
289
пределения памяти, и лишь в конце сортировки деструктор пула памяти вновь обращался к системе программирования для возврата всей заказанной памяти в систему.
В этой главе мы рассмотрим несколько способов организации систем распределения памяти, которые позволят нам самим программировать различные способы отведения и освобождения памяти в соответствии с потребностями решаемой задачи. Кроме того, мы рассмотрим, как язык C++ позволяет соединить удобство пользования операторами new и delete с преимуществами, которые может предоставить система распределения памяти, реализованная программистом.
5.1. Абстрактная система распределения памяти
Для того чтобы распределять память и управлять ею, необходимо иметь некоторый ее ресурс в своем распоряжении. Везде в этой главе мы будем считать, что такой ресурс памяти имеется в виде одного массива байтов достаточной величины. В этих условиях система должна предоставлять возможность выделения участков этой памяти требующейся длины (конечно, если свободная память еще имеется в наличии) и утилизации ранее выделенных участков памяти для последующего использования, когда у пользователя системы отпадает надобность в них. Можно считать, что система распределения памятью определяет абстрактный тип данных пул памяти, над которым определены две основные операции: заказ и освобождение памяти. Если считать, что пользователь системы получает участки памяти в виде указателей неопределенного типа (void *), то интерфейс с такой абстрактной системой может быть описан следующим образом:
class MemoryManagement { public :
// Метод get обеспечивает заказ участка памяти размером bytes байтов //и выдает указатель на выделенный фрагмент памяти. Данный фрагмент // исключается из системы и может быть использован для хранения // произвольной информации. Если система не может выделить непрерывный // участок памяти запрошенного размера, то в качестве результата // выдается пустой указатель NULL, virtual void * get(size_t bytes) = 0;
// Метод release возвращает ранее заказанный участок памяти в систему.
// Система гарантирует правильную работу метода только в том случае,
// если указатель area, переданный методу в качестве аргумента,
// является указателем, ранее выданным методом get.
290
Гпава 5
//В систему возвращается весь выделенный ранее участок памяти;
// возврат памяти по частям невозможен, virtual void release(void * area) = 0;
};
Надо сказать, что наличие метода release для освобождения памяти и утилизации ее в системе — это очень важный момент. Если такого метода нет или он по тем или иным соображениям не нужен, то реализация системы распределения памяти может быть очень простой. Именно такая простая система и была представлена в разд. 2.2 при описании реализации цифровой сортировки. Там надобности в операции release не возникало, поскольку весь пул памяти очищался сразу.
Мы вводим интерфейс с системой распределения памяти на языковом уровне. Функция такой системы — это создание надстройки над средствами управления памятью, которые представлены в ядре языка. Функции такой создаваемой в программе системы — это предоставление простых или узкоспециализированных средств по управлению памятью для нужд программы или ее отдельных частей. Однако можно заметить, что сами стандартные языковые средства предоставляют некоторую реализацию подобного же интерфейса. Действительно, роль методов get и release в языке С играют системные функции maiioc (caiioc) и free. Ту же роль в языке C++ исполняют операторы new И delete.
Здесь уместно заметить, что сами по себе операторы new и delete не предполагают никакой реализации системы распределения памяти, они лишь опираются на некоторую такую систему, предоставляемую языком. Однако если у нас в программе представлена другая система управления памятью, то мы можем вместо стандартной системы использовать именно ее. Такая возможность реализуется с помощью переопределения операторов new и delete для любого из классов, определяемых в программе.
Предыдущая << 1 .. 94 95 96 97 98 99 < 100 > 101 102 103 104 105 106 .. 161 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.