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

compiler support for stateful allocators in STL containers

本文关键字:状态 分配器 支持 STL 编译器      更新时间:2023-10-16

新的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.IntrusiveBoost.Container

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

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

相关文章: