5

Boost 的any_range文档说明如下:

尽管底层any_iterator是最快的可用实现,但any_range由于实现增量、减量、提前、相等等所需的虚函数调用成本,性能开销仍然是可观的。通常更好的设计选择是转换为规范形式

作者所说的“规范形式”是什么意思?有人可以举个例子吗?

编辑: 正如这里所建议的,我在 boost 用户的邮件列表中提出了同样的问题。以下是本文原作者 Neil Groves 所说的:

例如,将范围复制到向量中。

是的,这正是我在编写文档时想到的替代设计。在 any_range 上进行迭代的开销相当大,并且通常与将具体结果类型复制到容器(例如向量)中相比较差。然而,情况并非总是如此,Boost.Range 的一些用户希望能够实现对 any_range 实例进行操作的算法。这有时是可取的,例如,允许从支持各种容器的共享库中公开算法。使用 any_range 也可能适用于范围内的通过次数很少,但底层容器的内存大小非常大的情况。

在许多情况下,性能开销无关紧要。我想确保我没有误导任何人广泛采用 any_range 用法。我相信这个类的有效用法很少,但有时它正是正确的设计选择。我将在适当的时候通过一些额外的说明和示例来改进文档。

4

2 回答 2

3

的目的any_range是包装一些具体的迭代器类型,这样如果您更改了该底层迭代器的细节,您的代码用户就不需要重新编译。将其视为迭代器的Pimpl

该文档只是说明直接公开底层具体迭代器类型总是更有效(在运行时)。

于 2011-04-08T23:08:38.880 回答
3

我认为他们的意思是将您的范围转换为std::vector,或项目中的任何标准容器,并将迭代器返回到其中。

权衡是在将范围从原始范围类型复制到规范容器类型的成本,以及与用于实现 any_range 的类型擦除相关的堆分配和虚函数调用的成本之间。根据该范围内的元素数量、每个元素的大小以及在该范围内将进行多少次传递,一种选择可能比另一种更好。

于 2011-04-09T19:30:55.080 回答