无界数组类似于a std :: vector就可以了 大小超过任何固定界限。然而 unbounded_array旨在达到最佳效果 性能。因此unbounded_array 没有模拟序列 std :: vector确实。
这是什么意思?
答案 0 :(得分:13)
作为一名Boost开发者,我可以告诉你,对文档中的陈述提出质疑是完全可错的; - )
从阅读这些文档和阅读源代码(参见storage.hpp)我可以说,在编写代码时对std :: vector的实现做了一些假设,这有点正确。该代码最初可以追溯到2000年,也许可以追溯到2002年。这意味着当时许多STD实现都没有很好地优化容器中对象的破坏和构造。关于非调整大小的主张很容易通过使用最初的大容量向量来驳斥。关于速度的说法,我认为,完全来自于unbounded_array有特殊的代码来消除dtors&当存储的对象具有平凡的实现时,ctors。因此,它可以避免在必须重新排列事物或复制元素时调用它们。与最近的STD实现相比,它不会更快,因为新的STD实现倾向于利用移动语义等优点来进行更多优化。
答案 1 :(得分:12)
似乎缺少insert
和erase
方法。因为这些可能是“慢”,即它们的性能取决于size()
实现中的vector
,所以它们被省略以防止程序员在脚下射击自己。
insert
和erase
将容器称为序列,因此与vector
不同,unbounded_array
不是序列。
本身没有成为序列就没有效率。
但是, 在其内存分配方案中更有效率,避免使用vector::capacity
的概念,并始终使分配的块完全符合内容的大小。这使unbounded_array
对象变小,使堆上的块完全符合它所需的大小。
答案 2 :(得分:0)
正如我从链接文档中所理解的那样,它完全是关于分配策略的。 std :: vector afaik推迟分配直到需要,并且可能会分配一些合理的meory,unbounded_array接缝块来提前分配更多内存,因此它可能会更少地分配。但这只是文档中的声明,它分配的内存比可能需要的多,并且分配更昂贵。