Недавно я обнаружил библиотеку Boos Pool и начал адаптировать ее к своему коду.Одна вещь, о которой в библиотеке упоминалось, что она отсутствовала, - это базовый класс, который переопределяет операторы new / delete для любого класса и использует пул для управления памятью.Я написал свою собственную реализацию, и с некоторым программированием на основе мета-шаблонов он действительно выглядел очень прилично (поддерживая любой класс размером от 1 до 1024 байт, просто производный от базового класса)
Я упомянул эти вещи, потому чтодо сих пор это было действительно круто и захватывающе, и затем я нашел это сообщение из списка рассылки Boost .Похоже, некоторые люди действительно бьют библиотеку Pool и особенно указывают на неэффективность метода free (), который, по их словам, выполняется за O (n) раз.Я прошел по коду и обнаружил, что это реализация этого метода:
void free(void * const chunk)
{
nextof(chunk) = first;
first = chunk;
}
Для меня это выглядит как O (1), и я действительно не вижу неэффективности, о которой они говорят.Одна вещь, которую я заметил, это то, что если вы используете несколько экземпляров singleton_pool (то есть разные теги и / или размеры выделения), они все используют один и тот же мьютекс (критический раздел, если быть более точным), и это можно немного оптимизировать.Но если бы вы использовали обычные операции с кучей, они использовали бы ту же форму синхронизации.
Так кто-нибудь еще считает библиотеку пула неэффективной и устаревшей?