Шаг 54.
Библиотека STL.
Обработка ошибок и исключений. Распределители памяти

    На этом шаге мы приведем общие сведения по использованию распределителей памяти.

    В стандартной библиотеке C++ достаточно часто используются специальные объекты, занимающиеся выделением и освобождением памяти. Такие объекты называются распределителями (allocators). Распределитель представляет собой абстракцию, которая преобразует потребность в памяти в физическую операцию ее выделения. Параллельное использование разных объектов-распределителей позволяет задействовать в программе несколько разных моделей памяти.

    Сначала распределители появились в STL для решения раздражающей проблемы с различиями в типах указателей для разных моделей памяти (near, far, huge). Сейчас на их основе создаются решения, способные поддерживать разные модели памяти (общая память, уборка "мусора", объектно-ориентированные базы данных) без изменения интерфейса. Впрочем, такое применение распределителей - явление относительно недавнее, и оно еще не получило широкого распространения (вероятно, в будущем ситуация изменится).

    В стандартной библиотеке C++ определяется следующий распределитель по умолчанию:

  namespace std {
    template <class T>
    class allocator; 
  }

    Этот распределитель используется по умолчанию во всех тех ситуациях, когда распределитель может передаваться в качестве аргумента. Он использует стандартные средства выделения и освобождения памяти, то есть операторы new и delete, но в спецификации ничего не говорится о том, когда и как эти операторы должны вызываться. Таким образом, конкретная реализация распределителя по умолчанию может, например, организовать внутреннее кэширование выделяемой памяти.

    В большинстве программ используется распределитель по умолчанию. Иногда библиотеки предоставляют специализированные распределители, которые просто передаются в виде аргументов. Необходимость в самостоятельном программировании распределителей возникает очень редко, на практике обычно достаточно распределителя по умолчанию.

    Со следующего шага мы начнем знакомиться со вспомогательными средствами стандартной библиотеки C++.




Предыдущий шаг Содержание Следующий шаг