为什么'unbounded_array'比'vector'更有效?

时间:2010-04-26 02:40:49

标签: c++ boost containers

It says here

  

无界数组类似于a   std :: vector就可以了   大小超过任何固定界限。然而   unbounded_array旨在达到最佳效果   性能。因此unbounded_array   没有模拟序列   std :: vector确实。

这是什么意思?

3 个答案:

答案 0 :(得分:13)

作为一名Boost开发者,我可以告诉你,对文档中的陈述提出质疑是完全可错的; - )

从阅读这些文档和阅读源代码(参见storage.hpp)我可以说,在编写代码时对std :: vector的实现做了一些假设,这有点正确。该代码最初可以追溯到2000年,也许可以追溯到2002年。这意味着当时许多STD实现都没有很好地优化容器中对象的破坏和构造。关于非调整大小的主张很容易通过使用最初的大容量向量来驳斥。关于速度的说法,我认为,完全来自于unbounded_array有特殊的代码来消除dtors&当存储的对象具有平凡的实现时,ctors。因此,它可以避免在必须重新排列事物或复制元素时调用它们。与最近的STD实现相比,它不会更快,因为新的STD实现倾向于利用移动语义等优点来进行更多优化。

答案 1 :(得分:12)

似乎缺少inserterase方法。因为这些可能是“慢”,即它们的性能取决于size()实现中的vector,所以它们被省略以防止程序员在脚下射击自己。

标准要求

inserterase将容器称为序列,因此与vector不同,unbounded_array不是序列。

本身没有成为序列就没有效率。

但是, 在其内存分配方案中更有效率,避免使用vector::capacity的概念,并始终使分配的块完全符合内容的大小。这使unbounded_array对象变小,使堆上的块完全符合它所需的大小。

答案 2 :(得分:0)

正如我从链接文档中所理解的那样,它完全是关于分配策略的。 std :: vector afaik推迟分配直到需要,并且可能会分配一些合理的meory,unbounded_array接缝块来提前分配更多内存,因此它可能会更少地分配。但这只是文档中的声明,它分配的内存比可能需要的多,并且分配更昂贵。