gpt4 book ai didi

c++ - 为什么迭代器不依赖于分配器? (也就是说,让迭代器 SCARY 不会违反分配器的 typedef 抽象吗?)

转载 作者:搜寻专家 更新时间:2023-10-31 01:46:58 25 4
gpt4 key购买 nike

在阅读 C++11 中的 SCARY 迭代器时,I see :

From a compiler perspective there is nothing wrong here. From a practical standpoint, however, there isn’t any semantic dependence between list iterators and list allocators. And, in general for all STL containers, iterators only depend (semantically speaking) on the container element type.

虽然有些事情我不明白:

迭代器返回 referencepointeroperator * 时输入或 operator->应用于他们。 reference , pointer , difference_type等源自 typedef s 在 allocator 中。

但是分配器不一定必须定义pointer作为value_type * (甚至 difference_type 作为 ptrdiff_t ),例如。

迭代器(一个可怕的迭代器)如何在不知道分配器的情况下知道返回什么数据类型?

迭代器不是天生就依赖于这些 typedef 的分配器吗?

最佳答案

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

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

只要分配器不提供 typedef 或类型与 allocator_traits 中提供的默认值相同,就没有必要根据用于构造容器的分配器来区分迭代器。在该假设不成立的情况下,实现可以确定为那些提供与默认类型不同的 typedef 集的分配器使用不同的迭代器类型。

请注意,我没有查看它们的实现,因此请从表面上看:这将支持预期目的(在不违反标准合规性的情况下最大限度地减少生成的代码)。

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

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

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

关于c++ - 为什么迭代器不依赖于分配器? (也就是说,让迭代器 SCARY 不会违反分配器的 typedef 抽象吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19944621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com