boost pool_alloc - PullRequest
       19

boost pool_alloc

6 голосов
/ 31 марта 2010

Почему boost :: fast_pool_allocator построен поверх одноэлементного пула, а не отдельного пула на экземпляр распределителя? Или, другими словами, зачем только предоставлять это, а не возможность иметь пул на распределитель? Будет ли это плохой идеей?

У меня есть класс, который внутренне использует около 10 различных типов boost :: unordered_map. Если бы я использовал std :: allocator, тогда вся память возвращалась бы в систему, когда она вызывала delete, тогда как теперь мне нужно вызывать release_memory для многих различных типов распределителей в какой-то момент. Я был бы глуп, чтобы бросить мой собственный распределитель, который использует пул вместо singleton_pool?

спасибо

1 Ответ

4 голосов
/ 31 марта 2010

Распределителю трудно иметь состояние, поскольку все экземпляры распределителя должны были быть «эквивалентными» для использования стандартной библиотекой (по крайней мере, переносимо).

От 20.1.5 / 4 «Требования к распределителю»:

При реализации контейнеров, описанных в этом международном стандарте, разрешается предполагать, что их параметр шаблона Allocator соответствует следующим двум дополнительным требованиям, помимо тех, которые приведены в таблице 32.

  • Все экземпляры данного типа распределителя должны быть взаимозаменяемыми и всегда сравниваться равными друг другу

Затем он продолжает:

Разработчикам рекомендуется предоставлять библиотеки, которые могут принимать распределители, инкапсулирующие более общие модели памяти и поддерживающие неравные экземпляры. В таких реализациях любые требования, предъявляемые к распределителям контейнерами помимо тех требований, которые указаны в таблице 32, и семантика контейнеров и алгоритмов, когда экземпляры распределителя сравниваются неравно, определяются реализацией.

Таким образом, реализация может быть написана для разрешения неэквивалентных экземпляров распределителя, но тогда ваш распределитель зависит от поведения, определенного реализацией.

См. этот другой SO-ответ для некоторых дополнительных деталей (и, похоже, мне нужно иметь тенденцию к некоторому обещанному обновлению этого ответа ...)

...