Шаг 553.
Библиотека STL. Распределители памяти. Использование распределителей в прикладном программировании

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

    Распределители памяти представляют собой специализированные абстракции, преобразующие потребности в памяти в непосредственные вызовы. Принципы работы распределителей памяти (далее - просто "распределителей") будут подробно рассмотрены в следующих шагах.

    С точки зрения прикладного программиста, работать с разными распределителями памяти несложно; достаточно передать нужный распределитель в аргументе шаблона. Например, следующий фрагмент создает разные контейнеры и строки с использованием специального распределителя МуАНосо:

// Вектор со специальным распределителем
std::vector<int,MyAlloc<int> > v;

// Отображение int/float со специальным распределителем
std::map<int,float,less<int>,
         MyAlloc<std::pair<const int,float> > > m;

// Строка со специальным распределителем
std::basic_string<char,std::char_traits<char>,MyAlloc<char> > s;

    Если вы используете собственный распределитель памяти, вероятно, для него стоит определить некоторые типы. Пример:

// Специальный строковый тип, использующий специальный распределитель
typedef basic_string<char,std::char_traits<char>,
                     MyAlloc<char> > xstring;

// Специальное отображение string/string со специальным распределителем
typedef std::map<xstring,xstring,less<xstring>,
                 MyAlloc<std::pair<const xstring,xstring> >> xmap;

// Создание объекта типа xmap
xmap mymap;

    Объекты с нестандартными распределителями памяти внешне ничем не отличаются от обычных объектов. Однако нельзя забывать, что элементы с разными распределителями не должны смешиваться; в противном случае возможны непредсказуемые последствия. Чтобы проверить, используют ли два распределителя одну модель памяти, воспользуйтесь оператором ==. Если оператор возвращает true, то память, выделенная одним распределителем, может быть освобождена через другой распределитель. Во всех типах, параметризованных по распределителю, определена функция get_allocator(), предназначенная для получения объекта распределителя. Пример:

  if (mymap.get_allocator() == s.get_allocator()) { 
  //ОК. mymap и s используют одинаковые 
  // или взаимозаменяемые распределители
  .   .   .   .
}

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




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