首页 > 后端开发 > C++ > `std::make_shared` 与 `std::shared_ptr`:哪个更高效?

`std::make_shared` 与 `std::shared_ptr`:哪个更高效?

Barbara Streisand
发布: 2024-12-14 02:04:10
原创
652 人浏览过

`std::make_shared` vs. `std::shared_ptr`: Which is More Efficient?

辨别 std::make_shared 与直接 std::shared_ptr 使用的效率

了解 std::make_shared 和直接构造 std 之间的效率差异: :shared_ptr 可能是一项令人困惑的任务。在这里,我们深入进行详细比较,以阐明每种方法的复杂性。

探索构造顺序

考虑以下代码片段:

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
std::shared_ptr<Object> p2(new Object("foo"));
登录后复制

直接 std::shared_ptr构造:

  1. 对象的堆分配
  2. 共享指针构造函数,为元数据分配另一个堆区域

std::make_shared用法:

  1. 组合堆分配,包含对象和元数据

揭示效率增益

关键区别在于所需的堆分配数量:

  • make_shared: 1 分配
  • 直接shared_ptr: 2 分配

make_shared 中的这种单一分配消除了对显式新调用的需要,从而提高了效率。

异常注意事项

Pre-C 17:
异常处理以前可能会造成影响造成严重破坏,因为原始指针可能无法安全地传递给共享指针构造函数。

C 17 及更高版本:
由于函数参数求值顺序的更改,此问题已得到解决。如今,异常得到了妥善处理,确保了内存完整性。

std::make_shared 的一个小缺点

正如 Casey 指出的,一个潜在的缺点源于单一分配:

  • 在控制块不再使用之前,受控内存无法释放,由于弱指针,可能会延长内存保留时间参考文献。

以上是`std::make_shared` 与 `std::shared_ptr`:哪个更高效?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板