新的 C++11 标准需要 STL 实现来支持容器中的有状态分配器。现在主要的 STL 实现(Visual Studio 2008、2010、libstdc++)是否符合这个要求?我在 MSDN 或 libstdc++ 文档中对此一无所知。
2 回答
看起来 STL 容器中的状态分配器功能已经得到广泛支持。在大多数情况下,分配器的状态性不会造成麻烦。尚未得到广泛支持的是新标准处理问题情况的方式(交换容器(是否也交换分配器),列表拼接)。
这个线程说:
在大多数当前标准库(包括 MS 使用的 Dinkumware's)的代码中,支持有状态分配器
这个踏板(libstdc++,2004)说(如果我理解正确的话):
我们已经支持分配器 where
l1.get_allocator() != l2.get_allocator()
. 我们不做任何特殊规定来检测 和 中的splice()
分配器swap()
。
这个博客条目(libstdc++,2009)说:
C++0x 模式中的现有容器现在与有状态分配器一起更有效(即,在元素构造时不会动态创建分配器)。
所有容器都满足所有最新的分配器要求,完全支持有状态的分配器。– 优化了无状态分配器的空间。
EASTL支持有状态分配器。
该线程包含有关此功能的可移植性的有趣争议。
所以大多数 STL 实现都支持有状态的分配器,这意味着它们不会在后台创建分配器类型的额外实例,而是存储客户端提供的分配器实例,并且所有分配/解除分配都是通过它完成的。然而,他们处理swap
ping的方式list::splice
是无证的、不可移植的。
UPDATE: VS2008's STL requires the allocators to have the templated copy constructor, which IMO makes the most important use of custom allocators impossible: simple segregated storage.
For whoever is not satisfied with the current state of stateful allocators in STL, I recommend to consider Boost.Intrusive
and Boost.Container
.
g++还不支持作用域分配器。
VS2010 支持某些非标准分配器,但显然不支持标准分配器