繁体   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