[英]Is it possible to improve code performance by using reserve() before moving a vector with a bigger size into a vector with a smaller capacity?
如果這個問題非常不完整,不清楚或重復(這是我的第一個問題),請提前抱歉。 在學習移動語義和為我的OOP課程開展一個小項目時,我偶然發現了一個我無法自己回答的問題。 據我所知,std :: move()通過將l值轉換為r值來工作,但我們假設我們將具有大量元素的向量移動到容量為1的第二個向量中。我可以使用reserve( )為了避免大量的第二個向量的自動內存重新分配或者使用reserve()沒有效果,因為std :: move()將r值移動到第二個向量中? 我的問題的簡單實現可以在下面找到。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> first (1000000);
std::vector<int> second (1);
std::fill(first.begin(),first.end(),7);
second.reserve(1000000);//is this needed??
second=std::move(first);
return 0;
}
不,這不是必需的,幾乎可以肯定是過早的優化。
一個向量真的可以用3個指針(或兩個指針和一個偏移量,或者一個指針和兩個偏移量)來表示......但是那些並不常見,因此對於我的其余解釋,我將想象向量由三個表示指針)。
移動構造函數std::vector<int> a = std::move(b);
可以通過從b
取出這三個指針來實現,將它們設置為一些易於制作的值(例如, nullptr
作為哨兵值意味着“我是空的”)然后一切都將完成。
事實上,這就是gcc
如何做到的(以及大多數標准庫實現......但我有gcc
源碼方便)。 看到這里 。
因此,您的reserve
調用最好由編譯器優化為無操作,最壞的情況是導致不必要的內存分配。 不好!
請看一下這篇文章: STL vector:移動向量的所有元素
std::move()
是一個O(1)
解決方案。 當你在向量上使用ith時,移動的向量現在是空的,而新的向量包含移動的向量的所有元素。 在這種情況下, reserve()
方法不會發生任何事情(但在其他情況下它非常有用)。
您可以使用std::swap()
方法,這也是一種不需要使用reserve()
方法的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.