Поддержка компилятора для генераторов с поддержкой состояния в контейнерах STL

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

Ответ 1

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

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

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

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

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

В этой записи в блоге (libstdС++, 2009) говорится:

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

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

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

EASTL поддерживает statefull allocators.

Этот поток содержит интересный спор о том, насколько переносимой является эта функция.

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

UPDATE: VS2008 STL требует, чтобы распределители имели шаблонный конструктор копирования, который IMO делает наиболее важным использование пользовательских распределителей невозможным: простое разделенное хранилище.

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