C++0x中allocator_traits<T>的目的是什么?

16

为什么C++0x没有使用查询分配器成员类型的标准C++03接口?在哪些情况下成员类型不足以满足要求?

2个回答

12
为了解释allocator_traits的设计模式,它是一个Adapter,用于包装您的自定义Allocator,满足更少的实现要求(不需要构造、销毁、所有那些typedefs...),并将其转换为FlyWeight对象,通过静态成员和类型为您完成其余的Allocator实现要求。
使用allocator_traits,您只需要根据open-std文档Scoped Allocator Model的第3页提供最少10行代码即可创建您的自定义allocator(感谢@icecrime提供的信息)。
我认为allocator_traits和allocator是将非FlyWeight对象转换为FlyWeight的一个好例子,以减轻实现细节的负担。这是将本应该一开始就是FlyWeight的类转换为FlyWeight的良好API设计实践。

对于Java程序员而言,在设计模式方面,std::allocator_traits就像是继承自java.lang.CharacterData的package private类CharacterDataLatin1、ChracterData00、CharacterData0E、01、02等,提供了静态Unicode定义和帮助函数,这些函数将被每个Character(即std::allocator)类的实例所共享。

编辑: 通过allocator_traits间接调用自定义分配器的另一个优点是它保证了向前兼容性(见Scoped Allocator Model第3页)。 未来可能会增加要求的数量,即使您不知道如何实现新的要求到您的分配器中,那些要求也已经在编译器制造商实现的allocator_traits中存在。由于C++容器通过allocator_traits间接调用分配器,因此使用您的自定义分配器的STL容器将从新要求中受益,无需您更改代码。


2
这与享元模式有什么关系让人困惑。难道不是为了减少内存使用吗?而且,他们不能只告诉人们从std::allocator继承吗...? - user541686
@user541686:你必须将享元模式抽象出来,并将其应用于在时间模板实例化时发生的类型计算所建模的语言中。在这个模型中,领域内的对象实际上是类型,每个实例化上下文都是一个不同的(模板)元程序,其输出是请求的模板特化。由于该模型中的对象是C++类型,并且由于大多数分配器定义它们的嵌套类型的方式类似,因此allocator_traits<A>充当了单个默认类型集合上的享元对象。 - Julien Villemure-Fréchette

9

我对这种事情 (完全) 不熟悉,但这个文档似乎是一个很好的起点,可以掌握allocator_traits背后的原理:

这个提案的关键是定义一个allocator_traits模板,其中包含使用分配器的类型和静态成员函数,有效地替换了在Frankfurt丢失的Allocator概念。


1
似乎没有必要使用auto p = allocator_traits<Alloc>::allocate(myalloc, n);而不是auto p = myalloc.allocate(n);,因为前者最终会调用后者。为什么他们还要添加前者的接口呢? - user283145
1
@buratinas:在我看来,要支持作用域分配器模型 - icecrime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接