新的c++ 11标准要求STL实现支持容器中的有状态分配器。主要的STL实现(Visual Studio 2008, 2010, libstdc++)现在符合这个要求吗?我在MSDN或libstdc++文档中没有找到任何关于此的信息。
看起来STL容器中有状态分配器的特性已经得到了广泛的支持。在大多数情况下,分配器的状态完备性不会造成麻烦。尚未得到广泛支持的是新标准处理有问题情况的方式(交换容器(是否也交换分配器),列表的拼接)。
这个线程说:
在大多数当前标准库(包括MS使用的Dinkumware)的代码中,支持有状态分配器
这句话(libstdc++, 2004)说(如果我理解正确的话):
我们已经支持
l1.get_allocator() != l2.get_allocator()
。我们没有做任何特殊的规定来检测splice()
和swap()
中的分配器。
这个博客条目(libstdc++, 2009)说:
c++ 0x模式下的现有容器现在与有状态分配器一起使用时会更高效(即,在元素构造时不会动态创建分配器)。
这个文档介绍了新的libc++库:
所有容器满足所有最新的分配器要求它们完全支持有状态分配器。-为无状态分配程序优化了空间。
EASTL支持有状态分配器
这个线程包含了一个有趣的争论,关于这个特性的可移植性。
所以大多数STL实现都支持有状态的分配器,这意味着它们不会在底层创建分配器类型的额外实例,而是存储客户端提供的分配器实例,所有的分配/释放都是通过它完成的。然而,他们处理swap
ping和list::splice
的方式是未记录的,不可移植的。
UPDATE: VS2008的STL要求分配器具有模板化的复制构造函数,这使得自定义分配器最重要的用途不可能实现:简单的隔离存储。
对于STL中有状态分配器的当前状态不满意的人,我建议考虑Boost.Intrusive
和Boost.Container
。
g++还不支持作用域分配器。
VS2010支持某些非标准分配器,但显然不支持标准分配器