std::make_shared通过一次内存分配同时创建对象和控制块,减少开销、提升缓存局部性;保证异常安全,避免参数求值顺序导致的内存泄漏;并支持类型推导,使代码更简洁安全,是创建shared_ptr的首选方法。

使用 std::make_shared 相比于直接使用 new 配合 std::shared_ptr 构造,主要优势体现在内存分配效率和代码安全性上。核心在于:它将控制块(control block)与实际对象的内存分配合并为一次操作,减少了动态内存分配的开销。
std::shared_ptr 内部需要两个部分:
当这样写时:
std::shared_ptr会发生两次独立的内存分配:
立即学习“C++免费学习笔记(深入)”;
而使用:
auto ptr = std::make_shared则只进行一次内存分配。这块内存同时包含:
这种合并分配减少了 heap 分配调用次数,降低内存碎片,提升缓存局部性,尤其在高频创建场景下性能更优。
考虑函数调用:
foo(std::shared_ptr虽然 new 和 shared_ptr 构造看似原子,但参数求值顺序未定义。可能执行顺序为:
使用 make_shared 可避免此问题:
foo(std::make_shared因为 make_shared 调用本身是单个表达式,要么成功返回 shared_ptr,要么抛出异常但不会造成资源泄漏。
make_shared 利用模板参数推导,避免重复书写类型名:
auto ptr = std::make_shared相比:
std::shared_ptr更简洁,减少出错可能,也便于重构。
基本上就这些。make_shared 在性能、安全、可读性上都优于手动 new 配合 shared_ptr,应作为首选方式,除非需要自定义删除器或无法满足继承场景的多态构造需求。
以上就是C++ make_shared优势 内存分配优化分析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号