Материалы книги получены с http://www.itlibitum.ru/
Пространтсва памяти
Все эти фокусы образуют фундамент для дальнейшего строительства, но относить их к архитектуре было бы неверно. Для действительно нетривиального управления памятью понадобятся нетривиальные организационные концепции. В простейшем случае вся доступная память рассматривается как один большой блок, из которого выделяются блоки меньшего размера. Для этого можно либо напрямую обратиться к операционной системе с требованием выделить большой блок памяти при запуске, либо косвенно, в конечном счете перепоручая работу операторным функциям ::operator new и ::operator delete.
В двух последних главах мы взглянем на проблему с нетривиальных позиций и поделим доступную память на пространства (memory spaces). Пространства памяти - это концепция; ее можно реализовать на основе практически любой описанной выше блочно-ориентированной схемы управления памятью. Например, в одном пространстве памяти может использоваться система напарников, а в другом - списки свободной памяти. Концепция представлена в следующем абстрактном базовом классе:
class MemSpace {
public:
void* Allocate(size_t bytes) = 0;
void Deallocate(void* space, size_t bytes) = 0;
};
(Если ваш компилятор поддерживает обработку исключений, при объявлении обоих функций следует указать возможность инициирования исключений.) Некоторым пространствам памяти можно не сообщать в функции Deallocate() размер возвращаемых блоков; для конкретных схем могут появиться другие функции, но минимальный интерфейс выглядит именно так. Возможно, также будет поддерживаться глобальная структура данных - коллекция всех MemSpace (причины рассматриваются ниже). Коллекция должна эффективно отвечать на вопрос: «Какому пространству
памяти принадлежит данный адрес?» По имеющемуся адресу объекта вы определяете пространство памяти, в котором он живет.
В реализации пространств памяти могут быть использованы любые методики, описанные в предыдущей главе:
1.Глобальная перегрузка операторов new и delete (обычно не рекомендуется).
2.Перегрузка операторов new и delete на уровне класса.
3.Использование оператора new с аргументами под руководством клиента.
4.Использование оператора new с аргументами на базе ведущих указателей.
Существует немало причин для деления памяти на пространства. Ниже описаны некоторые распространенные стратегии выбора объектов, которые должны находиться в одном пространстве памяти.
Назад Содержание Далее
|