2010-07-25 2 views
8

Я использую список классов в C++ и я не знаю, что это значит Распределитель здесьчто это значит Распределитель в STL

template < class T, class Allocator = allocator<T> > class list; 

, если у меня есть list <int> mylist это означало бы выделить целый тип памяти с помощью аллокатора когда элемент добавляется в список? и когда вам нужен пользовательский распределитель?

ответ

11

Да. allocator - способ факторизации выделения памяти из памяти. Если контейнер необходимо некоторое количество памяти, вместо:

// too rigid, cannot allow custom allocation schemes 
void* mem = ::operator new(someAmount); 

Вы получаете:

// flexible, allows custom allocation schemes 
void* mem = myallocator.allocate(someAmount); 

Существует стандартный распределитель, std::allocator, который использует глобальный operator new и operator delete.

Вы хотите использовать свой распределитель в любое время, когда вам нужно выделять особым образом. Эти случаи могут быть: получить память из какого-либо фриланса, выделить из стека и т. Д. (Как правило, для целей оптимизации, хотя вы также можете записывать статистику с помощью специального распределителя). В большинстве случаев стандартный распределитель работает отлично.

2

В дополнение к тому, что указал GMan, пользовательские распределители могут использоваться для выравнивания памяти. Некоторые высокопроизводительные библиотеки, которые используют набор инструкций SIMD, требуют согласованной памяти. Эти библиотеки могут предоставить вам готовые к использованию распределители, которые вы можете подключить к любому контейнеру STL. Для исключения ложного обмена в многопоточном коде есть также выделенные с помощью кеша распределители. TBB от Intel поставляется с масштабируемыми распределителями, которые могут ускорить многопоточное распределение/деление памяти.