簡體   English   中英

在將具有更大尺寸的矢量移動到具有更小容量的矢量之前,是否可以通過使用reserve()來提高代碼性能?

[英]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個指針(或兩個指針和一個偏移量,或者一個指針和兩個偏移量)來表示......但是那些並不常見,因此對於我的其余解釋,我將想象向量由三個表示指針)。

  1. 一個指針指向它管理的內存的開始。
  2. 一個指針指向已插入其中的項目的一個結尾。
  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM