shared_ptrs 的 random_shuffle 向量不好(甚至危险)吗?
Is it bad (or even dangerous) to random_shuffle vector of shared_ptrs?
using namespace std;
vector< shared_ptr<MyObject> > objects;
// objects gets filled in by something
random_shuffle(objects.begin(), objects.end());
出于某种原因,这是否不好或效率低下?有更好的方法吗? (我希望我的智能指针数组随机排序)
编辑:
我问是因为会有很多互换,而且由于我不知道幕后的实现,我想知道是否有可能:
- 大量引用计数可能会疯狂地上下波动,从而影响性能
- 更糟糕的是,是否存在可能导致内存泄漏的循环引用
不,这并没有什么不好或低效的地方。
std::random_shuffle
仅以某种随机方式交换硬币容器的元素。 std::swap
专用于 std::shared_ptr
,因此它与交换两对原始指针一样安全高效,无需
lots of reference counts could be going up and down like crazy,
impacting performance
即使不存在这样的专门化,它仍然是安全和高效的,因为它只依赖于 移动 共享指针,而不是复制它们(并移动 std::shared_ptr
不影响引用计数器)。
至于循环引用,如果你有 - 它们仍然会存在,如果你没有 - swap
不能引入新的。
使用 std::random_shuffle
的要求是元素应该是 ValueSwappable 并且容器应该有 random_access 迭代器支持。 std::shared_ptr
s 是 ValueSwappable,std::vector 有随机访问迭代器。所以应该是安全的,不会对std::shared_ptr::use_count()
.
做任何改变
http://en.cppreference.com/w/cpp/concept/RandomAccessIterator
using namespace std;
vector< shared_ptr<MyObject> > objects;
// objects gets filled in by something
random_shuffle(objects.begin(), objects.end());
出于某种原因,这是否不好或效率低下?有更好的方法吗? (我希望我的智能指针数组随机排序)
编辑: 我问是因为会有很多互换,而且由于我不知道幕后的实现,我想知道是否有可能:
- 大量引用计数可能会疯狂地上下波动,从而影响性能
- 更糟糕的是,是否存在可能导致内存泄漏的循环引用
不,这并没有什么不好或低效的地方。
std::random_shuffle
仅以某种随机方式交换硬币容器的元素。 std::swap
专用于 std::shared_ptr
,因此它与交换两对原始指针一样安全高效,无需
lots of reference counts could be going up and down like crazy, impacting performance
即使不存在这样的专门化,它仍然是安全和高效的,因为它只依赖于 移动 共享指针,而不是复制它们(并移动 std::shared_ptr
不影响引用计数器)。
至于循环引用,如果你有 - 它们仍然会存在,如果你没有 - swap
不能引入新的。
使用 std::random_shuffle
的要求是元素应该是 ValueSwappable 并且容器应该有 random_access 迭代器支持。 std::shared_ptr
s 是 ValueSwappable,std::vector 有随机访问迭代器。所以应该是安全的,不会对std::shared_ptr::use_count()
.
http://en.cppreference.com/w/cpp/concept/RandomAccessIterator