boost::array
的效果与std::vector
的表现相比较,以及哪些因素会对其产生重大影响?
答案 0 :(得分:31)
boost::array
(或C ++ 0x的std::array
)应该比std::vector
更快,因为boost::array
个实例完全在堆栈上。这意味着boost::array
没有堆分配,这也意味着它不能超过您在构造时为其指定的大小。
boost::array
的目的是作为原始数组周围的薄层,因此您可以将它们视为标准容器.begin()
,.end()
等。好的编译器应该消除所有开销boost::array
,使其与原始数组的执行方式相同。
所有这些都涉及“默认”设置,你没有自定义分配器,你可以测量简单的事情,如数组构造,访问和元素修改。另一方面,事情可以在其他测试,其他平台或聪明的设置中转变。例如,
std::vector
的大小可能不再那么昂贵。std::vector
与另一个boost::array
交换通常是一个非常快速的操作;交换两个指针的速度。交换两个n
实例可能要贵得多;按照复制std::array
元素的顺序。但是,在C ++ 0x中,boost::array
将成为其中的一部分,由于rvalue引用及其移动语义,交换两个数组将再次快速。您可以查看哪个更快,以供您使用,但即使是此测试也只会让您了解特定平台上特定版本的特定编译器。
答案 1 :(得分:17)
得出任何结论的最佳方法是编写程序以使用大量数据测试其性能。如何得出任何结论?
在您使用它时,您可能需要一些工具来帮助您,例如VTune或AMD CodeAnalyst Performance Analyzer等。Very Sleepy(免费工具)是C / C ++适用于Windows系统的CPU分析器。你可以尝试一下!
答案 2 :(得分:12)
std::vector
输入速度更快,因为它的字符少一个。
无论什么更快,你要比较两个不同的东西,一个静态大小的数组和一个动态大小的数组。使用哪个取决于您的应用程序,与速度无关。
您想在某个地方操作飞机或汽车吗?这取决于更多只是“更快”。
分配boost::array
的速度可能更快,因为它在典型的机器上是堆栈上的。或者std::vector
可能几乎与某些自定义内存分配方案一样快。
但这只是分配。怎么用?那么两者都只是一个数组的索引,所以也许没有区别。但是移动或交换呢? boost::array
当然不能那么快,因为std::vector
只需要移动/交换指针。或许不是,谁知道?
您必须剖析并查看装配体。没有人能够神奇地知道事情的表现如何。
答案 3 :(得分:2)
array
和vector
的目的略有不同。如果将vector
初始化为您需要的大小并且永远不会重新分配,则两者之间的性能是相同的。 array
只处理静态大小的数组(如果你愿意,可以处理C风格的数组)。如果您将更多对象推入容器中,则vector
可以增长,而不是当前容量。