На этом шаге мы рассмотрим назначение и использование распределителей.
Распределители памяти представляют собой специализированные абстракции, преобразующие потребности в памяти в непосредственные вызовы. Принципы работы распределителей памяти (далее - просто "распределителей") будут подробно рассмотрены в следующих шагах.
С точки зрения прикладного программиста, работать с разными распределителями памяти несложно; достаточно передать нужный распределитель в аргументе шаблона. Например, следующий фрагмент создает разные контейнеры и строки с использованием специального распределителя МуАНосо:
// Вектор со специальным распределителем 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 используют одинаковые // или взаимозаменяемые распределители . . . . }
На следующем шаге мы рассмотрим использование распределителей при программировании библиотек.