Программирование. Принципы и практика использования C++ Исправленное издание, стр. 350
Операции размещения и удаления объектов в стеках и пулах выполняются предсказуемо и быстро.
Таким образом, в системах с жесткими условиями реального времени и в системах, предъявляющих особые требования к обеспечению безопасности, при необходимости можно использовать стеки и пулы. Кроме того, желательно иметь возможность использовать стеки и пулы, разработанные, реализованные и протестированные независимыми поставщиками (при условии, что их спецификации соответствуют нашим требованиям).
vectormapstringnew
25.3.3. Пример пула
Пул — это структура данных, из которой мы можем доставать объекты заданного типа, а затем удалять их оттуда. Пул содержит максимальное количество объектов, которое задается при его создании. Используя темно-серый цвет для размещенного объекта и светло-серый для места, готового для размещения объекта, мы можем проиллюстрировать пул следующим образом.
Класс
Pooltemplate<class T, int N>class Pool { // Пул из N объектов типа Tpublic: Pool(); // создаем пул из N объектов типа T T* get(); // берем объект типа T из пула; // если свободных объектов нет, // возвращаем 0 void free(T*); // возвращаем объект типа T, взятый // из пула с помощью функции get() int available() const; // количество свободных объектов типа Tprivate: // место для T[N] и данные, позволяющие определить, какие объекты // извлечены из пула, а какие нет (например, список свободных // объектов)};Каждый объект класса
PoolPool<Small_buffer,10> sb_pool;Pool<Status_indicator,200> indicator_pool;Small_buffer* p = sb_pool.get();// ...sb_pool.free(p);Гарантировать, что пул никогда не исчерпается, — задача программиста. Точный смысл слова “гарантировать” зависит от приложения. В некоторых системах программист должен написать специальный код, например функцию
get()get()dial_buffer_pool.get()0Естественно, наш шаблонный класс
Pool25.3.4. Пример стека
Стек — это структура данных, из которой можно брать порции памяти и освобождать последнюю занятую порцию. Используя темно-серый цвет для размещенного объекта и светло-серый для места, готового для размещения объекта, мы можем проиллюстрировать пул следующим образом.

Как показано на рисунке, этот стек “растет” вправо. Стек объектов можно было бы определить как пул.
template<class T, int N> class Stack { // стек объектов типа T // ...};Однако в большинстве систем необходимо выделять память для объектов разных размеров. В стеке это можно сделать, а в пуле нет, поэтому мы покажем определение стека, из которого можно брать “сырую” память для объектов, имеющих разные размеры.
template<int N>class Stack { // стек из N байтовpublic: Stack(); // создает стек из N байтов void* get(int n); // выделяет n байтов из стека; // если свободной памяти нет, // возвращает 0 void free(); // возвращает последнее значение, // возвращенное функцией get() int available() const; // количество доступных байтов