11

新的 C++11 标准需要 STL 实现来支持容器中的有状态分配器。现在主要的 STL 实现(Visual Studio 2008、2010、libstdc++)是否符合这个要求?我在 MSDN 或 libstdc++ 文档中对此一无所知。

4

2 回答 2

15

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

这个线程说:

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

这个踏板(libstdc++,2004)说(如果我理解正确的话):

我们已经支持分配器 where l1.get_allocator() != l2.get_allocator(). 我们不做任何特殊规定来检测 和 中的splice()分配器swap()

这个博客条目(libstdc++,2009)说:

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

该文档介绍了新的libc++ 库

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

EASTL支持有状态分配器。

该线程包含有关此功能的可移植性的有趣争议。

所以大多数 STL 实现都支持有状态的分配器,这意味着它们不会在后台创建分配器类型的额外实例,而是存储客户端提供的分配器实例,并且所有分配/解除分配都是通过它完成的。然而,他们处理swapping的方式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.

于 2011-08-01T11:01:32.423 回答
3

g++还不支持作用域分配器。

VS2010 支持某些非标准分配器,但显然不支持标准分配器

于 2011-07-28T14:58:13.447 回答