【发布时间】:2012-06-05 17:45:07
【问题描述】:
简短介绍:我正在处理多线程代码,我必须在两个线程之间共享动态分配的对象。为了使我的代码更简洁(并且不易出错),我想在每个线程中显式“删除”对象,这就是我想使用shared_ptr 的原因。
第一个问题:
我想知道在运行时shared_ptr 中的-> operator 的实现是否有一些额外的开销(例如大于unique_ptr)。我所说的对象通常是 longlife 实例,在创建后只复制一次(当我在线程之间分发它们时),然后我只访问这些对象的方法和字段。
我知道,shared_ptr 只保护引用计数。
第二个问题:
shared_ptr 在 libstdc++ 中的优化程度如何?它总是使用互斥锁还是利用原子操作(我专注于 x86 和 ARM 平台)?
【问题讨论】:
-
在
shared_ptr的良好实现中,通过->取消引用指针时应该有零开销。我不熟悉 libstdc++,所以我无法回答你的第二个问题。不过,您有标题,因此您可以通过查看它的实现方式轻松找到。 -
如果代码是多线程的,GCC 的共享指针使用
std::atomic<int>或类似的东西作为引用计数器;这是否是真正的硬件(无锁)原子取决于编译器版本——我相信这在 GCC 4.7.0 中得到了改进。 -
复制/赋值/超出范围有额外的开销,因为引用计数的线程安全增量。
operator->看起来与旧的auto_ptr完全相同,即可以预期开销为零。 -
这个问题目前的形式过于宽泛,无法回答。
shared_ptr的实现有很多,GCC和libstdc++的版本也很多。你说的是哪一个?
标签: c++ c++11 shared-ptr