簡體   English   中英

優化向量分配c ++

[英]Optimizing vector assignment c++

我有一個返回向量的函數。 我們把它命名為v 我在函數中使用v.begin()v.end() 我怎樣才能使用.begin().end()而無需創建一個新的向量v2來存儲前一個向量v這樣我就可以訪問方法了?

這就是我的意思:

std::vector<int> merge(...) {
    ...
    return v;
}
void mergeSort(...) {
    ...
    std::vector<int> v2;
    v2 = merge(...);
    I_need_this = v2.begin();
    And_I_really_need_this_too = v2.end();
    ...
}

優化分配的最佳方法是根本不分配,而是使用初始化

std::vector<int> v2 = merge(...);

幾乎可以肯定,編譯器會直接在v2創建v ,而不進行任何復制。

當您需要返回集合時,為了防止它們被復制,常見的模式是通過非const引用傳遞集合並對原始集合進行更改。 這意味着調用者負責實例化集合,而不是被調用者,因此不會發生任何副本。 這是一個例子:

void merge(std::vector<int> & result, ...) {

    // Do changes to result
    ...
}
void mergeSort(...) {
    ...
    std::vector<int> v;
    merge(v, ...);

    // This is OK now
    I_need_this = v.begin();
    And_I_really_need_this_too = v.end();
    ...
}

您可以將臨時矢量綁定到引用:

extern std::vector<int> f();

auto&& x = f();
std::sort(x.begin(), x.end());  // example

你有很多選擇:

  1. 別擔心。 性能通常不那么重要。

  2. 啟用優化(您會驚訝地發現SO上有多少“優化”問題通過該步驟解決)。

  3. 升級到C ++ 11編譯器。 編譯器應該使用向量的移動賦值運算符,這非常有效(任何像樣的庫都會將內部分配的數組從臨時數據傳輸到目標而沒有內存分配,也沒有復制元素)。

  4. 如果您不能使用C ++ 11編譯器,或者您已經測量過,並且這仍然是性能瓶頸,請按照Bo Person在他的回答中的建議切換到初始化

  5. 如果你已經測量過,這仍然是一個性能瓶頸,並且你無法讓你的編譯器實現RVO,那么你別無選擇,只能按照AndréFratelli在他的回答中的建議傳遞矢量值

如果我們退出討論優化,並討論編寫好的,清晰的代碼,那么我會按優先順序推薦:

  • 從函數結果初始化
  • 從功能結果分配
  • 通過向量填充。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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