![](/img/trans.png)
[英]Move std::vector<std::unique_ptr<T>> to std::vector<std::shared_ptr<T>>
[英]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.