Boost的any_range文档说明如下:
尽管底层的
any_iterator
是最快的可用实现,但any_range
的性能开销仍然是可观的,因为实现增量、递减、前进、相等等所需的虚拟函数调用的成本。通常更好的设计选择是转换为规范形式。
作者所说的"规范形式"是什么意思?有人能举个例子吗?
EDIT:正如这里所建议的,我在boost用户的邮件列表中问了同样的问题。这篇文章的原作者尼尔·格罗夫斯是这么说的:
例如,将范围复制到vector容器中。
是的,这正是我在编写文档时想到的另一种设计。迭代any_range的开销相当大,通常与将具体的结果类型复制到容器(如vector)相比要小得多。然而,对于Boost的一些用户来说,情况并非总是如此。Range希望能够实现在any_range实例上操作的算法。有时需要这样做,例如,允许公开来自支持各种容器的共享库的算法。使用any_range也可能是有意义的,当传递范围的次数很小,但底层容器的内存大小非常大。
在许多情况下,性能开销并不重要。我想确保我没有误导任何人广泛采用any_range用法。我相信这个类的有效用法很少,但有时正是正确的设计选择。我将在适当的时候用一些额外的说明和例子来改进文件。
我认为他们的意思是将您的范围转换为std::vector
,或者您的项目中的任何标准容器,并返回一个迭代器。
在将范围从原始范围类型复制到规范容器类型的成本,以及与用于实现any_range的类型擦除相关的堆分配和虚拟函数调用的成本之间进行权衡。根据范围内元素的数量、每个元素的大小以及在范围内传递的次数,一个选项可能比另一个更好。
any_range
的目的是包装一些具体的迭代器类型,这样如果更改底层迭代器的详细信息,代码的用户将不需要重新编译。可以把它看作迭代器的Pimpl。
文档只是说明直接暴露底层的具体迭代器类型总是更有效(在运行时)。