簡體   English   中英

返回向量 <Foo> 或shared_ptr <vector<Foo> &gt;?

[英]return vector<Foo> or shared_ptr<vector<Foo>>?

在一個函數中,“返回”會更合適嗎?

A. vector<Foo>

B. shared_ptr<vector<Foor>>

換句話說,哪個副本不那么沉重,你會做什么,為什么?

我認為返回shared_ptr<vector<T>>很少有用。 如果有幾個對象可以容納他們可以操作的共享向量,我只會這樣做。 對我而言,這表明存在設計缺陷。 一個更好的選擇可能是通過const引用返回。 這避免了(可能很昂貴的)復制操作,但是不允許訪問者改變向量。

如果要返回本地std::vector ,也可以通過參數返回它。

如果你真的想要返回shared_ptr<vector<T>> ,請考慮shared_ptr<const vector<T>>是否可以完成這項工作(向量可以被許多人檢查,但只能由所有者操縱)。

但是A通常比B貴,但返回值優化通常適用於此處。 對於C ++ 11, std::vector有一個移動構造函數,可以保證返回本地std::vector不需要昂貴的復制操作。

記住,不要過早優化:)

返回shared_ptr<vector<Foo>>保證不會發生額外的副本。

返回vector<Foo> 避免額外的副本,如果返回值優化(RVO)踢,或者如果從C ++ 11移動語義被使用。 但是,如果避免復制很重要,我就不會使用它(即使你可以確保這些優化總是可用的),因為我認為使用return-a-copy語義而不是實際意味着不復制是一個好主意。 。

我可能會選擇其中一種,但這取決於:

  • 傳遞對vector<Foo>的引用作為參數
  • 傳遞插入迭代器(例如back_inserter

在C ++ 03中,更喜歡:

  1. 如果提供對成員的訪問權限,則返回const引用。
  2. 否則,如果返回本地,請使用out參數。

在C ++ 11中,更喜歡:

  1. 如果提供對成員的訪問權限,則返回const引用。
  2. 否則,如果返回本地,則按值返回,因為移動構造將避免過多的副本。

您希望返回引用計數智能指針的情況是具有不相交生命周期的多個對象都將要訪問該對象的位置。 然而,這不是最常見的情況,但它確實經常發生。

暫無
暫無

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

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