поддержка компилятора для распределителей состояний в контейнерах STL - PullRequest
11 голосов
/ 28 июля 2011

Новый стандарт C ++ 11 требует, чтобы реализации STL поддерживали распределители с сохранением состояния в контейнерах. Соответствуют ли основные реализации STL (Visual Studio 2008, 2010, libstdc ++) этому требованию сейчас? Я ничего не нашел в MSDN или в документации по libstdc ++.

Ответы [ 2 ]

15 голосов
/ 01 августа 2011

Похоже, что функция распределителей с сохранением состояния в контейнерах STL уже широко поддерживается.В большинстве случаев состояние распределителя не вызывает проблем.То, что пока широко не поддерживается, - это новый способ обработки проблемных ситуаций новым стандартом (перестановка контейнера (нужно ли также перераспределять распределитель), объединение списков).

Этот поток говорит:

в коде для большинства современных стандартных библиотек (включая Dinkumware, используемые MS), поддерживаются распределители с сохранением состояния

Этот шаг (libstdc ++,2004) говорит (если я правильно понял):

Мы уже поддерживаем распределители, где l1.get_allocator() != l2.get_allocator().Мы не делаем никаких специальных положений для обнаружения этих распределителей в splice() и swap().

Эта запись в блоге (libstdc ++, 2009) гласит:

Существующие контейнеры в режиме C ++ 0x теперь более эффективны вместе с распределителями с сохранением состояния (т. Е. Во время создания элемента распределители не создаются на лету).

В этом документе говорится о новой библиотеке libc ++ :

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

EASTL поддерживает распределители состояния.

Этот поток содержит интересный спор о том, насколько это переносимоособенность.

Таким образом, большинство реализаций STL поддерживают распределители Statefull, что означает, что они не создают дополнительные экземпляры типа распределителя под капотом, но хранят предоставленный клиентом экземпляр распределителя, и все выделения / освобождения выполняются черезтот.Однако то, как они обрабатывают swap ping и list::splice, недокументировано, непереносимо.

ОБНОВЛЕНИЕ: STL VS2008 требует, чтобы распределители имели конструктор шаблонного копирования, что в IMO наиболее важно использовать пользовательскийраспределители невозможны: простое сегрегированное хранилище.

Для тех, кто не удовлетворен текущим состоянием распределителей с сохранением состояния в STL, я рекомендую рассмотреть Boost.Intrusive и Boost.Container.

3 голосов
/ 28 июля 2011

g ++ пока не поддерживает выделенные области выделения.

VS2010 поддерживает определенные нестандартные распределители , но, очевидно, не стандартные стандартные

...