簡體   English   中英

返回沒有副本的c ++ std :: vector?

[英]Returning a c++ std::vector without a copy?

是否可以從函數返回標准容器而無需復制?

示例代碼:

std::vector<A> MyFunc();

...

std::vector<A> b = MyFunc();

據我所知,這會將返回值復制到一個新的向量b中。 使函數返回引用或類似的東西可以避免復制嗎?

如果您的編譯器支持NRVO,那么只要在返回對象的函數中滿足某些條件,就不會進行復制。 值得慶幸的是,這最終是在Visual C ++ 2005(v8.0)中添加的。如果容器很大,這顯然會對perf產生重大影響。

如果您自己的編譯器文檔沒有說明它是否受支持,您應該能夠將C ++代碼編譯為匯編程序(在優化/發布模式下)並使用簡單的示例函數檢查已完成的操作。

還有一個很好的更廣泛的討論在這里

綁定到const引用的Rvalues(“temporaries”)將其生命周期延長到引用生命周期的末尾。 因此,如果您不需要修改該向量,則以下操作將:

const std::vector<A>& b = MyFunc();

如果你需要修改向量,只需按照最容易閱讀的方式對其進行編碼,直到你有證據(通過剖析獲得),這條線甚至在性能方面都很重要。

否則依賴C ++ 1x及其右值引用並移動語義“即將推出”並優化該副本而無需執行任何操作。

如果您可以修改該功能的簽名,那么您可以使用

std::vector<A>& MyFunc(); 

要么

void MyFunc(std::vector<A>& vect);

您還可以返回智能指針,但這涉及到新建對象。

some_smart_pointer<std::vector<A>> MyFunc();

HTH

暫無
暫無

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

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