如果resize()
std::vector
的某个尺寸小于其当前尺寸,那么该矢量是否可能会分配新内存?
出于性能原因,这对我很重要。
答案 0 :(得分:11)
不,resize
更小的尺寸永远不会重新分配。
如果容器收缩,所有迭代器,指针和对尚未删除的元素的引用在调整大小后仍然有效,并引用它们在调用之前引用的相同元素。
(来自here)
鉴于此,我们可以确定重新分配不会发生。
答案 1 :(得分:5)
resize()
减少时仅更改逻辑大小。其他人已经回答了这个,所以我在这里没有添加任何内容。这样做的目的是优化速度,因为它不需要重新分配或移动任何数据。
但是,当您想要优化内存使用时,C ++ 11引入了另一个函数shrink_to_fit()
,您可以在resize()
之后(或甚至在任何其他时间)调用,这将实际确保你不支付你不想要的任何记忆。
答案 2 :(得分:1)
没有。除了一些非常具体的条件外,vector
永远不会缩小它的记忆。请记住,当vector
调整大小时,迭代器会失效,因此它无法在您的背后执行此操作 - 这是一个可观察到的更改,并且标准指定了这可能发生或不发生的确切时间。
答案 3 :(得分:1)
没有。
Vector使用两个值: size 和 capacity 。大小是存储在向量中的实际元素数,而容量则是指内存中分配的保留空间。性能的提升来自于分配比所需更多的空间。
只有在执行大小超过当前容量的调整大小请求时,才会进行重新分配。此外,如果您尝试在向量的中间插入大量元素,它将影响算法性能,因为插入的元素之后的所有元素都需要移动(有时,如果超过容量,则可能会触发重新分配向量)。
您可以使用保留成员函数来进一步提高速度: reserve 成员函数将确保将容量设置为特定值。
您可以在第148页的书籍The C++ Standard Library: A Tutorial and Reference中阅读有关std :: vector的更多信息。
答案 4 :(得分:0)
首先,您必须衡量您想要优化的内容,仅靠性能是不够的,您的意思是什么? UI反应性?这需要您测量时间的典型用户操作。 重算法?等等 ... 然后你必须找到瓶颈的位置,可能是内存,磁盘访问等,最后可能是vector :: resize,但仅限于最后! 你问问题的方式,我打赌我的$ vector :: resize不会成为瓶颈。
对STL的设计方式充满信心,在修改STL行为之前检查代码; - )