gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:31:45 25 4
gpt4 key购买 nike

这与其说是性能问题,不如说是样式问题。我刚刚将(大部分)指针转换为 shared_ptr 对象,并且不情愿地接受 weak_ptr 作为原始指针的替代品。我的问题是,遍历共享指针对象序列(比方说 vector )的首选方法是什么?这是我一直在做的事情:

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 引用*规则,那么什么是好的替代方案,为什么?

我会问的问题是;该技术是否可靠,即。对于超小的 AMethod() 和超大的 my_sequence,由于 shared_ptr 拷贝,此方法是否会开始不必要地阻碍性能?它可读吗?简单吗?

最佳答案

首先声明一下:

shared_ptr不是 Elixir 。它应该在所有权实际共享时使用。非共享所有权用unique_ptr表示非所有权由(原始)引用表示。 weak_ptr用于 shared_ptr必须观察但不能拥有……但通常不是针对过时指针的良好防御实践。默认为 shared_ptr直接进入最低公分母;这是糟糕的编程习惯。


这里的选择在shared_ptr< T >之间, shared_ptr< T const > , shared_ptr< T > const & , 和 T const & , 和 T & .假设您没有更改任何内容,但序列可以 更改其对象,因此 const是可取的。这将它缩小到 shared_ptr< T const > , shared_ptr< T > const & , 和 T const & .

让我们将问题重新表述为,

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

据此,评估备选方案。

  • shared_ptr< T const > (按值传递共享指针)

    • +:直接的值语义;可以通过shared_ptr< T >
    • +:可复制或move d 扩大所有权池
    • +:传播const被调用函数的正确性
    • +:访问对象很快:包含一个直接指针参数
    • –:传递是昂贵的:复制两个机器字并原子接触一个引用计数
    • –: 被调用函数本身与所有权语义有关
  • shared_ptr< T > const & (通过引用传递共享指针)

    • +:传递与直接对象引用一样便宜
    • +:可复制扩大所有权池
    • –: 输 const调用函数的正确性

      • 如果你尝试 shared_ptr< T const > const &相反,您将传递一个临时拷贝,并以这种替代方法和按值传递的缺点而告终。
    • –:通过额外的间接访问对象

    • –: 被调用函数本身与所有权语义有关
  • T const & (直接引用)

    • +: 保留 const正确性
    • +:调用者不关心所有权语义
    • +:快速通过,只需要一个机器字
    • +:访问函数的快速、直接指针参数(即使那样)
    • –:不能授予所有权

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

如果所有权可能扩展到其他人,这将是使用 shared_ptr 的理由首先,那么你应该总是路过shared_ptr< [const] T >值(value)。是的,它确实复制了 shared_ptr随叫随到。但是复制 shared_ptr 的昂贵部分正在更新引用计数,而不是将指针压入堆栈。如果您要授予所有权,您无论如何都想更新引用计数。取传递的值和move触及引用计数。这样做之后,传递引用将没有任何优势,而且还有很多劣势。

关于c++ - 如何遍历一系列 shared_ptr 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17286827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com