【问题标题】:Is it bad (or even dangerous) to random_shuffle vector of shared_ptrs?shared_ptrs 的 random_shuffle 向量是否不好(甚至危险)?
【发布时间】:2015-06-16 19:57:53
【问题描述】:
using namespace std;
vector< shared_ptr<MyObject> > objects;

// objects gets filled in by something

random_shuffle(objects.begin(), objects.end());

出于任何原因,这是否不好或效率低下?有更好的方法吗? (我希望我的智能指针数组随机排序)

编辑: 我问是因为会有很多交换,而且由于我不知道幕后的实现,所以我想知道是否有可能:

  • 大量引用计数可能会像疯了一样上下波动,从而影响性能
  • 更糟糕的是,是否存在可能导致内存泄漏的循环引用

【问题讨论】:

  • 为什么会不好?你只是重新订购一个容器。你担心会发生什么?
  • 随机排序,你的意思是随机洗牌?
  • a.) 它可能效率低下,每次将指针分配给彼此时,引用计数都会上升和下降。或 b.) 也许循环引用可能会人为地增加引用计数,从而导致内存泄漏。我不知道,这就是我问的原因(我不确定引擎盖下发生了什么)。
  • 使用 C++11,这将移动 shared_ptr's,这是有效的。在 C++11 之前,这可能比您想象的要贵一些。但很难想象会出现如此昂贵的情况,以至于您会决定避免使用它。

标签: c++ vector shared-ptr smart-pointers shuffle


【解决方案1】:

不,这没有什么不好或低效的。

std::random_shuffle 仅以某种随机方式交换硬币容器的元素。 std::swap 专门用于 std::shared_ptr 的,因此它是安全且高效的,就像交换两对原始指针一样,无需

大量的引用计数可能会像疯了一样上下波动, 影响性能

即使不存在这样的特化,它仍然是安全和高效的,因为它只依赖于 移动 共享指针,而不是复制它们(移动 std::shared_ptr 不会影响引用计数器)。

至于循环引用,如果你有一些 - 它们仍然存在,如果你没有 - swap 不能引入新的。

【讨论】:

  • 假设平台有一些超级有效的方法来交换shared_ptrs,不会弄乱引用计数。据我所知,如果没有 c++11,这是无法保证的。
  • @DavidSchwartz 我希望 std::swap 专门用于 shared_ptr,即使在 c++11 之前的实现中也是如此。而且,嘿,已经是 2015 年了。
  • @DavidSchwartz "shared_ptr" ...“不保证没有 c++11”这没有意义,因为在 C++11 之前没有 std::shared_ptr。跨度>
  • @BaummitAugen 是的,因此您拥有的任何shared_ptr 实现都不能保证提供任何特定的性能特征。
  • @BaummitAugen 这不是std::shared_ptr,而是shared_ptr。许多库(例如 Boost.SmartPtr)都有自己的实现,独立于标准。
【解决方案2】:

std::random_shuffle 使用的要求是元素应该是 ValueSwappable 并且容器应该支持 random_access 迭代器。 std::shared_ptrs 是 ValueSwappable 并且 std::vector 具有随机访问迭代器。所以应该是安全的,不会对std::shared_ptr::use_count()做任何改变。

http://en.cppreference.com/w/cpp/concept/RandomAccessIterator

http://en.cppreference.com/w/cpp/concept/ValueSwappable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2021-09-21
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多