Переменный размер блока действительно вызывает фрагментацию. Посмотрите на картинку, которую я прилагаю:
Изображение ( отсюда ) показывает ситуацию, в которой A, B и C выделяют порции памяти, порции переменного размера.
В какой-то момент B освобождает все свои фрагменты памяти, и вдруг у вас появляется фрагментация. Например, если C необходимо выделить большой кусок памяти, который все еще помещается в доступную память, это не может быть сделано, потому что доступная память разделена на два блока.
Теперь, если вы подумаете о случае, когда каждый кусок памяти будет иметь одинаковый размер, эта ситуация явно не возникнет.
Пулы памяти, конечно, имеют свои недостатки, как вы сами указываете. Так что не стоит думать, что пул памяти - это волшебная палочка. Это имеет свою стоимость, и имеет смысл платить ее при определенных обстоятельствах (например, встроенная система с ограниченной памятью, ограничения в реальном времени и т. Д.).
Что касается того, какой пул памяти хорош в C ++, я бы сказал, что это зависит. Я использовал один под VxWorks, который был предоставлен ОС; в некотором смысле хороший пул памяти эффективен, когда он тесно интегрирован с ОС. На самом деле, каждая RTOS предлагает реализацию пулов памяти, я думаю.
Если вы ищете реализацию общего пула памяти, посмотрите на this .
EDIT:
Из вашего последнего комментария мне кажется, что, возможно, вы думаете о пулах памяти как о "решении" проблемы фрагментации. К сожалению, это не случай. Если вы хотите, фрагментация - это проявление энтропии на уровне памяти, то есть она неизбежна. С другой стороны, пулы памяти - это способ управления памятью таким образом, чтобы эффективно уменьшить влияние фрагментации (как я уже говорил и как упоминалось в Википедии, в основном на конкретных системах, таких как системы реального времени). Это дорого обходится, поскольку пул памяти может быть менее эффективным, чем «нормальный» метод выделения памяти, поскольку у вас минимальный размер блока. Другими словами, энтропия вновь появляется под маской.
Более того, это множество параметров, влияющих на эффективность системы пулов памяти, таких как размер блока, политика выделения блоков, или если у вас только один пул памяти, или у вас есть несколько пулов памяти с разными размерами блоков, разными временами жизни или разными политика.
Управление памятью - действительно сложный вопрос, а пулы памяти - это просто техника, которая, как и любая другая, улучшает вещи по сравнению с другими техниками и требует собственных затрат.