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