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

13 c++ traits allocator c++11

为什么不是标准的C++ 03接口来查询C++ 0x中使用的分配器的成员类型?成员类型不足的用例有哪些?

ice*_*ime 8

我对这种事情一点都不熟悉(根本没有),但这篇文章似乎是一个很好的起点,可以掌握背后的理由allocator_traits:

该提案的基石是定义allocator_traits 包含类型的模板和使用分配器的静态成员函数, 有效地取代Allocator了在法兰克福丢失的概念.


Dav*_*Lee 7

要根据设计模式解释allocator_traits,它的一个适配器可以包装你的自定义分配器,它满足更少的实现要求(不需要构造,销毁,所有那些typedef ...)并将其转换为完成其余部分的FlyWeight对象.具有静态成员和类型的Allocator实现要求.

使用allocator_traits,您只需要为自定义分配器提供至少10行代码,如open-std doc Scoped Allocator Model的第3页(对于@icecrime提及).

我认为allocator_traits和allocator是将非FlyWeight对象转换为FlyWeight的一个很好的现实示例,以减轻实现细节的负担.它是一个很好的API设计实践,可以将一个类变成FlyWeight,它本来应该是FlyWeight.

对于Java程序员来说,就设计模式而言,std :: allocator_traits就像包私有类CharacterDataLatin1,ChracterData00,CharacterData0E,01,02 ......继承自java.lang.CharacterData以提供静态Unicode定义和助手.由Character(std :: allocator)类的每个实例共享.

编辑:通过allocator_traits间接调用自定义分配器的另一个好处是它保证了foward兼容性(Scoped Allocator Model的第3页).未来的需求数量可能会增长,即使您对分配器实现新需求一无所知,这些需求也已经存在于编译器制造商实现的allocator_traits中.知道C++容器通过allocator_traits间接调用allocator,使用自定义分配器的STL容器将从新需求中受益,而无需更改代码.

  • 困惑这与享元模式有什么关系。这不是为了减少内存使用吗?另外,他们不能只是告诉人们从 `std::allocator` 继承......吗? (2认同)