c++ - 使用 shared_ptr 的开销和实现

标签 c++ c++11 shared-ptr

简短介绍:我正在处理多线程代码,我必须在两个线程之间共享动态分配的对象。为了使我的代码更简洁(并且不易出错),我想在每个线程中显式“删除”对象,这就是我想使用 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/

相关文章:

c++ - c++ regex/flex++ 中的模式 {sp} 是什么意思?

c++ - 像 typedef 一样使用 decltype

c++ - 在这种情况下我应该使用 unique_ptr 还是 shared_ptr?

c++ - 在x86/x86-64上智能指针的原子交换

c++ - 调用 join 后删除 std::thread?

c++ - C++ 中带有 std::for_each 的仿函数

C++11 字符串开头的不区分大小写的比较(unicode)

c++ - "map/set iterators incompatible" map 销毁,取决于构造函数调用

c++ - shared_ptr 的神秘崩溃

c++ - 当brew安装opencv3时,我得到警告,该公式没有--with-contrib选项