简短介绍:我正在处理多线程代码,我必须在两个线程之间共享动态分配的对象。为了使我的代码更简洁(并且不易出错),我想在每个线程中显式“删除”对象,这就是我想使用 shared_ptr
的原因。
第一个问题:
我想知道 shared_ptr
中 -> operator
的实现在运行时是否有一些额外的开销(例如,大于 unique_ptr
)。我所说的对象通常是 longlife 实例,创建后只复制一次(当我在线程之间分发它们时),然后我只访问这些对象的方法和字段。
我知道,shared_ptr
只保护引用计数。
第二个问题:
shared_ptr
在 libstdc++ 中的优化程度如何?它总是使用互斥锁还是利用原子操作(我专注于 x86 和 ARM 平台)?
最佳答案
First question: using
operator->
我见过的所有实现都有一个本地缓存 T*
就在 shared_ptr<T>
类,以便该字段在堆栈上,operator->
因此与使用本地堆栈 T*
的成本相当: 完全没有开销。
Second question: mutex/atomics
我希望 libstdc++ 在 x86 平台上使用原子,无论是通过标准工具还是特定的 g++ 内在函数(在旧版本中)。我相信 Boost 实现已经这样做了。
但是,我不能对 ARM 发表评论。
注意:C++11 引入了移动语义,shared_ptr
的使用中自然避免了很多拷贝.
注意:阅读 shared_ptr
的正确用法here ,您可以使用对 shared_ptr
的引用(const
与否)通常可以避免大多数复制/破坏,因此它们的性能并不太重要。
关于c++ - 使用 shared_ptr 的开销和实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10902227/