Новый стандарт С++ 11 требует реализаций STL для поддержки распределенных в штатах распределителей в контейнерах. Выполняют ли основные требования STL (Visual Studio 2008, 2010, libstdС++) к этому требованию? Я ничего не нашел об этом в MSDN или в документации libstdС++.
Поддержка компилятора для генераторов с поддержкой состояния в контейнерах STL
Ответ 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
.
Ответ 2
VS2010 поддерживает определенные нестандартные распределители но, по-видимому, не стандартные