2

在阅读 C++11 中的 SCARY 迭代器时,我看到

从编译器的角度来看,这里没有错。然而,从实际的角度来看,列表迭代器和列表分配器之间没有任何语义依赖性。而且,通常对于所有 STL 容器,迭代器仅依赖于(语义上)容器元素类型

不过有一点我不明白:

迭代器在或应用于它们 时返回referencepointer类型。, ,等是从分配器中的s派生的。operator *operator->referencepointerdifference_typetypedef

但是分配器不一定要定义pointervalue_type *(甚至difference_typeptrdiff_t),例如。

在不知道分配器的情况下,迭代器(一个 SCARY 的)如何可能知道要返回的数据类型?

难道迭代器本身就依赖于它们的这些类型定义的分配器吗?

4

1 回答 1

4

分配器最初的设计目的是为程序编译的平台的内存模型提供一个接口。大多数当前架构(如果不是全部)提供平面内存模型,并且单个指针类型可用于在任何程序中寻址内存(不再需要近指针和远指针)。

这反映在 C++11 中allocator_traits。现在分配器不需要提供许多以前需要的typedef,包括pointer_typeorreference_type等​​,difference_type因为有一个已知的良好默认值。这确实符合当前的实践,在大多数 STL 实现中,这些类型在所有分配器中都是相同的。

每当分配器不提供 typedef 或类型与提供的默认值相同时,allocator_traits根据用于构造容器的分配器来区分迭代器是没有意义的。如果该假设不成立,则实现可以确定仅对那些提供与默认值不同的 typedef 集的分配器使用不同的迭代器类型。

请注意,我没有查看它们的实现,所以从表面上看:这将支持预期目的(在不破坏标准合规性的情况下最小化生成的代码)。

另请注意,这不是唯一的方法。C++11 中的当前分配器模型支持使用多态分配器,即使标准尚未提供实现。对于多态分配器,单个分配器模板参数(多态适配器)提供类型定义和与容器的接口,在内部管理指向用于提供内存的实际分配器的指针。

多态分配器的目的与链接文章中引用的论文相同:允许创建词汇类型。SCARY分配器专注于为特定容器类型的迭代提供词汇类型,而多态分配器更进一步,可以将容器本身用作词汇类型,而不管获取内存的实际机制是什么。

您可以在 Bloomberg 的BSL中找到多态分配器的参考实现(使用不同的名称)

于 2013-11-13T04:29:26.567 回答