编译器支持STL容器中的有状态分配器

时间:2011-07-28 14:54:32

标签: c++ stl c++11 containers allocator

新的C ++ 11标准要求STL实现支持容器中的有状态分配器。主STL实现(Visual Studio 2008,2010,libstdc ++)现在是否符合此要求?我在MSDN或libstdc ++文档中找不到任何相关内容。

2 个答案:

答案 0 :(得分:15)

看起来STL容器中的有状态分配器的功能已经得到广泛支持。在大多数情况下,分配器的完整性不会造成麻烦。尚未广泛支持的是新标准处理有问题情况的方式(交换容器(是否交换分配器),列表拼接)。

This thread说:

  

在大多数当前标准库的代码中(包括MS使用的Dinkumware),支持有状态分配器

This tread(libstdc ++,2004)说(如果我理解正确的话):

  

我们已经支持l1.get_allocator() != l2.get_allocator()的分配器。我们不做的是制定任何特殊条款,以便在splice()swap()中检测这些分配器。

This blog entry(libstdc ++,2009)说:

  

C ++ 0x模式下的现有容器现在与有状态分配器一起使用效率更高(即,在元素构造时不会动态创建分配器)。

This document说新的libc++ library

  

所有容器都满足所有最新的分配器要求   它完全支持有状态分配器。    - 无状态分配器的空间被优化掉了。

EASTL支持有状态分配器。

This thread包含有关此功能的便携性的有趣争议。

因此大多数STL实现都支持statefull分配器,这意味着它们不会在底层创建分配器类型的其他实例,而是存储客户端提供的分配器实例,并且所有分配/解除分配都是通过它完成的。但是,他们处理swap ping和list::splice的方式没有记录,不可移植。

更新:VS2008的STL要求分配器具有模板化复制构造函数,IMO最不可能使用自定义分配器:简单的隔离存储。

对于对STL中有状态分配器的当前状态不满意的人,我建议考虑Boost.IntrusiveBoost.Container

答案 1 :(得分:3)

g ++ does not支持作用域分配器。

VS2010支持某些非标准分配器but not apparently the standard ones