当阅读有关C++ 11中的SCARY迭代器时,I see:
我对此有些不了解:
当将reference
或pointer
应用于迭代器时,迭代器将返回operator *
和operator->
类型。reference
,pointer
,difference_type
等是从分配器内部的typedef
派生的。
但是,例如,分配器不必将pointer
定义为value_type *
(甚至将difference_type
定义为ptrdiff_t
)。
迭代器(SCARY迭代器)如何在不知道分配器的情况下就知道要返回的数据类型?
对于这些typedef,迭代器不是固有地依赖于其分配器吗?
最佳答案
最初,分配程序被设计为提供一个接口(interface),该接口(interface)可用于程序正在为其编译的平台的内存模型。当前大多数架构(如果不是全部)都提供平面内存模型,并且可以使用单个指针类型来寻址任何程序中的内存(不再需要近指针和远指针)。
这反射(reflect)在allocator_traits
的C++ 11中。现在,分配器不必提供以前需要的许多typedef,包括pointer_type
或reference_type
,difference_type
等,因为存在一个已知的良好默认值。这确实符合当前的实践,在大多数STL实现中,所有分配器中的类型都是相同的。
每当分配器不提供typedef或类型与allocator_traits
中提供的默认值相同时,就没有必要根据用于构造容器的分配器来区分迭代器。如果该假设不成立,则实现可以确定仅对那些提供与默认类型不同的typedef的分配器使用不同的迭代器类型。
请注意,我没有看过它们的实现,因此请从表面上看:这将支持预期的目的(在不破坏标准合规性的情况下最小化生成的代码)。
还要注意,这不是唯一的方法。即使标准尚未提供实现,C++ 11中的当前分配器模型也支持使用多态分配器。使用polymorphic allocators,单个分配器模板参数(多态适配器)提供typedef和与容器的接口(interface),在内部管理指向用于提供内存的实际分配器的指针。
多态分配器的目的与链接文章中引用的论文相同:允许创建词汇类型。在SCARY分配器专注于为特定容器类型上的迭代提供词汇类型的情况下,多态分配器又走了一步,无论容器获取内存的实际机制是什么,都可以将容器本身用作词汇类型。
您可以在彭博的BSL中找到多态分配器的引用实现(使用不同的名称)
关于c++ - 为什么迭代器不依赖分配器? (即,是否使迭代器SCARY违反分配器的typedef抽象?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19944621/