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

Nei*_*l G 20 c++ containers boost

它在这里

无界数组类似于std :: vector,因为它的大小可以超过任何固定边界.然而,unbounded_array旨在实现最佳性能.因此,unbounded_array不像std :: vector那样对序列进行建模.

这是什么意思?

Gra*_*bot 13

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

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


Pot*_*ter 12

它似乎缺乏inserterase方法.因为这些可能是"慢",即它们的性能取决于size()vector实施中,他们被省略,以防止程序员从拍摄自己的脚.

inserterase由标准所要求的容器被称为一个序列,所以不像vector,unbounded_array是不是一个序列.

由于未能成为序列本身就没有效率.

但是,它在它的存储器分配方案更有效的,通过避免的概念vector::capacity和始终具有所分配的块的内容的准确尺寸.这使得unbounded_array对象变小并使堆上的块完全像它需要的那样大.