c – 如何遍历一系列shared_ptr对象?

这更像是一个造型而不是性能问题.我刚刚转换(大部分)指向shared_ptr对象的指针,并且不情愿地接受weak_ptrs作为原始指针的替代品.我的问题是,迭代共享指针对象的序列(比如说一个向量)的首选方法是什么?这是我一直在做的事情:

std::vector<std::shared_ptr<A>> my_sequence;
// Do something to fill my_sequence;

for (std::shared_ptr<A> const& ptr : my_sequence)
{
  ptr->AMethod();
}

这违背了*不要使用shared_ptr references *规则,那么什么是一个好的选择,为什么呢?

我会问的问题是;技术是否健全,即.对于AMethod()超小,my_sequence超大,这个方法会因shared_ptr副本而开始阻碍性能吗?它可读吗?这很简单吗?

最佳答案
首先,免责声明:

shared_ptr不是灵丹妙药.在实际共享所有权时应该使用它.非共享所有权由unique_ptr表示,非所有权由(原始)引用表示. weak_ptr是一个必须被观察但不被拥有的shared_ptr ……但是对于一般的过时指针来说,这不是一个很好的防御练习.默认为shared_ptr直接进入最低公分母;这是糟糕的编程习惯.

这里的选择是在shared_ptr< T>,shared_ptr< T const>,shared_ptr< T> const&,T const&和T&amp ;.让我们假设你没有改变任何东西,但序列可以改变它的对象,所以const是可取的.这缩小到shared_ptr< T const>,shared_ptr< T> const&和T const&amp ;. 让我们重新提出这个问题,

Is shared_ptr< T > const & ever the right choice?

从这个角度来看,评估替代方案.

> shared_ptr< T const> (按值传递共享指针)
>:直接的价值语义;可以通过shared_ptr< T>
>:可以复制或移动以扩展所有权池
>:将const正确性传播给被调用函数
>:对象的访问速度很快:包含直接指针参数
> – :传递很昂贵:复制两个机器字并原子触摸引用计数
> – :被调用的函数关注所有权语义

> shared_ptr< T> const& (通过引用传递共享指针)
>:传递与直接对象引用一样便宜
>:可以复制以扩展所有权池
> – :对被调用函数失去const正确性

>如果你尝试shared_ptr< T const> const&相反,您将传递一个临时副本,最终会遇到此替代方案和传值的缺点. > – :对象的访问通过额外的间接
> – :被调用的函数关注所有权语义

> T const& (直接参考)

>:保留const正确性
>:调用者不关心所有权语义
>:快速通过,只需一个机器字
>:访问函数的快速,直接指针参数(如果是这样)
> – :不能授予所有权

平衡地权衡它,如果没有扩展所有权(例如通过返回保留参数的对象),你真的应该传递一个简单的引用.在这种情况下,函数应该很少关心它的参数是如何拥有的.让它需要shared_ptr以最糟糕的方式违反了关注点的分离.您不能拥有本地对象或成员子对象,仍然可以使用该功能.最糟糕的是,一切都变得更加复杂.

如果所有权可能扩展到其他人,这首先是使用shared_ptr的理由,那么你应该总是通过shared_ptr< [const] T>值.是的,它会在调用时复制shared_ptr.但复制shared_ptr的昂贵部分是更新引用计数,而不是推送堆栈上的指针.如果您要授予所有权,则无论如何都要更新引用计数.获取传递的值并移动它,它不会触及引用计数.完成后,你通过引用传递没有任何优点和许多缺点.

转载注明原文:c – 如何遍历一系列shared_ptr对象? - 代码日志