簡體   English   中英

向量 <string> 或矢量 <shared_ptr<string> &gt;在c ++中14

[英]vector<string> or vector<shared_ptr<string>> in c++ 14

在舊的c ++樣式中,我總是使用vector < shared_ptr < string> >vector < string* >來避免在構造包含許多string對象的大vector時進行內存復制。

從c ++ 11開始,c ++具有rvaluemove語義; 我現在可以使用vector < string >嗎?

我使用gcc 7.1.0和clang 3.6與c ++ 14選項。

在以下幾種情況下,使用vector<shared_ptr<string>>vector<string*>可以幫助在C ++ 11之前優化性能:

向向量添加元素時,例如調用push_back()。

  • 舊行為:如果向量容量不夠大,將重新分配內部內存緩沖區,並將所有舊對象復制到新緩沖區。
  • C ++ 11行為:如果向量元素類型具有非投擲移動構造函數,則調用它而不是復制構造函數。 std::string具有非拋出移動構造函數,因此對於std::vector<string> push_back()應該std::vector<std::shared_ptr<string>>慢。

從函數返回作為局部變量的向量時

  • 舊行為:如果從函數或方法返回局部變量,則復制​​結果。 在一些有限的情況下,允許編譯器執行返回值優化 - 直接在調用者的堆棧上分配對象。
  • C ++ 11行為:如果返回值是rvalue,則調用向量的移動構造函數。 這個操作實際上非常便宜(只需交換兩個指針)。 所以對於int,這種情況下使用std::vector<string>也是合適的。

在不同向量之間共享字符串

如果你的目的是返回集合的副本而不是復制元素 - 這是std::vector<shared_ptr<string>>仍然std::vector<shared_ptr<string>>的唯一方法。 但在這種情況下,我的建議是在集合之間共享不可變對象,即使用std::vector<shared_ptr<const string>>

暫無
暫無

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

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