Пользовательские распределители STL для управления различными областями памяти - PullRequest
8 голосов
/ 22 октября 2009

Я хотел бы использовать различные экземпляры пользовательского класса-распределителя STL для управления различными пространствами памяти, а затем иметь возможность указывать экземпляр-распределитель для контейнера STL, так что каждый контейнер извлекает только из назначенного пространства памяти. Но я не понимаю, как я могу это сделать. Я вижу, как я могу передать тип распределителя в параметры шаблона контейнера STL, но я хочу что-то похожее на передачу экземпляра распределителя в конструктор контейнера STL. Есть ли способ сделать это в STL?

Ответы [ 3 ]

17 голосов
/ 22 октября 2009

К сожалению, распределители STL не могут иметь состояния (или, по крайней мере, должны быть очень осторожны при использовании этого состояния) - каждый экземпляр определенного типа распределителя должен быть эквивалентен для контейнеров STL для эффективной работы с ними. Я не помню подробностей прямо сейчас, но я знаю, что Скотт Мейерс подробно обсуждает эту проблему в «Эффективный STL» , пункт 10: знать о соглашениях и ограничениях распределителя.

Тем не менее, вы можете иметь шаблонные распределители, которые очень похожи с различиями между распределителями, инкапсулированными в типе распределителя, и использовать разные «экземпляры» шаблона распределителя (каждый экземпляр «экземпляра» является другой тип). Опять же, я помню, что Мейерс обсуждает это довольно четко.

Например, см. Этот абзац из статьи Энтони Ауэ, «Повышение производительности с помощью пользовательских распределителей пула для STL» :

Потенциально более серьезное предостережение заключается в том, что, поскольку распределитель использует нестатические данные, он технически не соответствует Стандарту, поскольку Стандарт требует, чтобы распределители одного типа были эквивалентными. См. Эффективный STL (пункт 10) для подробного объяснения проблемы. Это сводится к требованию, чтобы распределитель для данного типа мог освобождать память, выделенную любым другим экземпляром распределителя для этого типа. Для многих применений стандартных контейнеров это требование не является необходимым (некоторые могут сказать, Draconian). Однако есть два случая, когда это требование абсолютно необходимо: list :: splice и swap (). Случай swap () особенно серьезен, поскольку он необходим для реализации определенных операций над контейнерами безопасным для исключений образом (см. «Исключительный C ++», пункт 12). Технически, подкачка может быть (и в некоторых случаях) реализована перед лицом распределителей, которые не сравниваются одинаково - элементы могут быть скопированы или распределители могут быть обменены вместе с данными - но это не всегда так. По этой причине, если вы используете swap () или list :: splice, вы должны обязательно использовать HoldingPolicySingleton; в противном случае вы столкнетесь с каким-то по-настоящему неприятным поведением.

См. Также обсуждение Стефана Т. Лававея в этой ветке новостной группы .

Я обновлю позже вечером, если кто-то еще не сообщит подробности.

6 голосов
/ 22 октября 2009

Контейнеры STL позволяют передавать распределитель в качестве аргумента в конструктор.

Например, вот соответствующие конструкторы для вектора:

explicit vector(const Allocator& = Allocator());
explicit vector(size_type n, const T& value = T(),
  const Allocator& = Allocator());
template <class InputIterator>
vector(InputIterator first, InputIterator last,
  const Allocator& = Allocator());

По умолчанию они просто используют созданный по умолчанию распределитель.

0 голосов
/ 22 октября 2009

Возможно, вы могли бы закодировать набор типов распределителей, который содержит статическое указание на отдельные области памяти.

Затем, когда контейнер STL создает свой распределитель, распределитель использует пространство памяти, назначенное этому распределителю.

Для простоты предположим, что вы хотите использовать два пространства памяти. Создайте два типа распределителя, по одному для каждого пространства. При необходимости передайте тип распределителя конструкторам контейнеров STL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...