簡體   English   中英

為什么/何時應該在std :: vector <>上使用std :: unique / shared_ptr(std :: vector <>)?

[英]Why/when should I use std::unique/shared_ptr (std::vector<>) over just std::vector<>?

當我可以簡單地使用std::vector<>時,我對std::unique/shared_ptr(std::vector<>)的主要用法有些困惑,據我所知,它本身就是動態的數組。 正如我在周圍所看到的,人們說這兩者之間沒有任何性能差異。 因此,基於所有這些,使用指向容器(在本例中為向量)而不是向量的智能指針有什么意義?

首先,你不應該使用std::shared_ptr ,除非你需要特定的關聯“共同擁有”語義std::shared_ptr 如果您需要智能指針,則默認情況下應默認使用std::unique_ptr ,並且僅在明確發現需std::unique_ptr的情況下才將其切換。

其次: 表面上看 ,首選std::unique_ptr<TYPE>不是TYPE是如果您計划將對象移動很多。 這是不可移動或移動昂貴的大型對象的常見設計范例,即大型對象實現了復制構造函數而未實現移動構造函數,因此移動被迫表現得像“復制”。

但是, std::vector確實具有相對有效的移動語義:如果左右移動std::vector ,無論其所包含的類型有多復雜,該移動僅構成幾個指針交換。 移動std::vector不會引起大量的計算復雜性,這沒有真正的風險。 即使在覆蓋先前分配的數組(調用向量中所有對象的析構函數)的情況下,如果您使用的是std::unique_ptr<std::vector<TYPE>> ,仍然會遇到這種復雜性,什么都不省。

std::unique_ptr<std::vector<TYPE>>有兩個優點。 第一個是它擺脫了隱式副本構造函數。 也許您想強制維護程序員不要復制該對象。 但這是相當利基的用途。 另一個優點是,它允許您規定沒有向量的情況,即vec.size() == 0是與doesNotExist(vec)不同的條件。 但是即使在這種情況下,您也應該更喜歡std::optional<std::vector> ,它可以更好地通過代碼傳達對象的意圖。 授予的std::optional僅在C ++ 17→代碼中可用,因此也許您處於尚未實現它的環境中。 但是否則,沒有理由使用std::unique_ptr<std::vector>

因此,總的來說,我認為std::unique_ptr<std::vector>沒有實際用途。 它和std::vector之間沒有實際的性能差異,使用它只會使您的代碼不必要地復雜。

暫無
暫無

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

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