На этом шаге мы приведем общие сведения по использованию распределителей памяти.
В стандартной библиотеке C++ достаточно часто используются специальные объекты, занимающиеся
выделением и освобождением памяти. Такие объекты называются распределителями (allocators).
Распределитель представляет собой абстракцию, которая преобразует потребность в памяти в физическую операцию
ее выделения. Параллельное использование разных объектов-распределителей позволяет задействовать в программе
несколько разных моделей памяти.
Сначала распределители появились в STL для решения раздражающей проблемы с различиями в типах
указателей для разных моделей памяти (near, far, huge). Сейчас на их основе создаются решения, способные
поддерживать разные модели памяти (общая память, уборка "мусора", объектно-ориентированные базы данных)
без изменения интерфейса. Впрочем, такое применение распределителей - явление относительно недавнее, и
оно еще не получило широкого распространения (вероятно, в будущем ситуация изменится).
В стандартной библиотеке C++ определяется следующий распределитель по умолчанию:
namespace std { template <class T> class allocator; }
Этот распределитель используется по умолчанию во всех тех ситуациях, когда распределитель может передаваться в
качестве аргумента. Он использует стандартные средства выделения и освобождения памяти, то есть операторы
new и delete, но в спецификации ничего не говорится о том, когда и как эти операторы должны
вызываться. Таким образом, конкретная реализация распределителя по умолчанию может, например, организовать
внутреннее кэширование выделяемой памяти.
В большинстве программ используется распределитель по умолчанию. Иногда библиотеки предоставляют
специализированные распределители, которые просто передаются в виде аргументов. Необходимость в
самостоятельном программировании распределителей возникает очень редко, на практике обычно достаточно
распределителя по умолчанию.
Со следующего шага мы начнем знакомиться со вспомогательными средствами стандартной библиотеки C++.