关于STL中的非平等分配器

时间:2017-12-04 13:34:28

标签: c++ stl

我正在阅读Scott Meyers关于C ++中分配器的有效STL中的第10项。

  

标准说允许STL的实现   所有相同类型的分配器对象都是等效的并且总是如此   比较平等。

     

这一切都很好,但你想的越多。更多   你会意识到STL的限制是多么严厉   实现可以假设相同类型的分配器是   当量。它意味着可移植的分配器对象 - 分配器   将在不同的STL实现下正常运行 - 可能不会   有州。让我们明确一点:它意味着可移植   分配器可能没有任何非静态数据成员,至少不是任何   这会影响他们的行为。没有。纳达。这意味着,例如,你   不能有一个从一个堆分配的SpecialAllocator   一个不同的SpecialAllocator,它从不同的分配   堆。这样的分配器不等同于STL实现   存在尝试使用两个分配器可能导致损坏的情况   运行时数据结构。

     

为了公平对待标准化委员会,我应该指出   它包括紧接在文本之后的以下声明   允许STL实现者假设相同类型的分配器   等同于:

     

鼓励实施者提供......支持的图书馆   不平等的情况。在这样的实现中。 ...的语义   分配器实例比较不相等时的容器和算法   是实现定义的。

     

这是一种可爱的情绪,但作为STL的用户是谁   考虑开发一个带状态的自定义分配器,它   为您提供无所不能。您可以利用此声明   只有当(1)你知道你正在使用的STL实现时   支持不等价的分配器,(2)你愿意深入研究   他们的文档确定是否实现定义   “非平等”分配器的行为是可以接受的,

     

(3)您不关心将代码移植到STL   可以明确利用纬度的实现   由标准扩展到他们。总之,这一段 - 段落   第20.1.5节第5节。对于那些坚持认识的人 - 是   标准的“1有一个梦想”的分配器演讲。直到那个梦想   变得普遍现实,程序员关注可移植性会   将自己限制为没有状态的自定义分配器。

我对上段的问题是

  1. 作者对不等价或不等分配器的意思是什么?

  2. 上述文字的最后一段是什么,即第3点是简单的意思?

2 个答案:

答案 0 :(得分:4)

该信息已过期。 C ++ 11及更高版本支持有状态分配器。

如果您正在编写需要自定义分配器的C ++库,不需要C ++ 11,并且支持针对未知/未指定的标准库构建,那么您从Effective C ++发布的引用只会引起关注。首先,没有人再这样做了。以前做过这种事的人经常有自己的"增强"用于支持有状态分配器的标准库实现,例如EASTL或BDESTL。

答案 1 :(得分:2)

如果一个分配的内存可以被另一个分配,则两个分配器应该相等。因此,例如,从它所拥有的池中分配的分配器对象可以从该池分配和释放内存,但是具有不同池的不同分配器对象不能(没有大量额外的簿记)分配可用内存由第一个对象。

正确地完成这项工作超出了标准委员会在首次引入分配器时想要采取的措施,这就是为什么这些措辞非常软弱。该许可证已在更新版本的标准中被撤销。

最后一段意味着如果你编写一个对象依赖于内部状态的分配器(例如,我上面提到的池分配器),并且你正在使用的库尊重相等运算符(如同,它不会尝试在不比较相等的分配器之间传递指针,当你尝试将它与不注意相等运算符的不同实现一起使用时,你的代码就会中断。