当前位置: 首页 > news >正文

为什么相比直接使用new和std::shared_ptr构造函数,make_shared在内存分配和管理方面更为高效。

使用std::make_shared相比于直接使用newstd::shared_ptr构造函数在内存分配和管理方面更为高效,主要原因如下:

内存分配效率

std::make_shared通过一次内存分配来同时分配控制块(用于引用计数等)和对象的内存。这种方式减少了内存分配的次数,提高了效率。

auto sp = std::make_shared<int>(10);

这里,std::make_shared一次性分配了包含控制块和int对象的内存。

直接使用newstd::shared_ptr构造函数

直接使用newstd::shared_ptr构造函数通常需要进行两次内存分配,一次用于对象本身,另一次用于控制块。

std::shared_ptr<int> sp(new int(10));

这里,new int(10)分配了对象的内存,然后std::shared_ptr构造函数再分配控制块的内存。

内存局部性

由于std::make_shared将对象和控制块分配在一起,这些内存通常是连续的,能够更好地利用CPU缓存,提高程序的运行效率。

异常安全性

使用std::make_shared能够确保在对象构造期间如果抛出异常,不会导致内存泄漏。因为对象和控制块的内存是在一次操作中分配的,如果构造对象时抛出异常,分配的内存会自动释放。

auto sp = std::make_shared<int>(10); // 如果在构造int对象时抛出异常,内存会被自动释放

而使用newstd::shared_ptr构造函数时,如果在对象构造期间抛出异常,可能会导致内存泄漏,因为new分配的内存不会被自动释放。

std::shared_ptr<int> sp(new int(10)); // 如果在构造int对象时抛出异常,new分配的内存不会被自动释放

总结

std::make_shared在内存分配和管理方面更为高效的原因包括:

  1. 通过一次内存分配同时分配控制块和对象的内存,减少了内存分配的次数。
  2. 更好的内存局部性,能够更有效地利用CPU缓存。
  3. 提供更好的异常安全性,防止在对象构造期间发生异常时导致的内存泄漏。
http://www.lryc.cn/news/413224.html

相关文章:

  • 7-Python数据类型——列表和元组的详解(增删改查、索引、切片、步长、循环)
  • 大数据-61 Kafka 高级特性 消息消费02-主题与分区 自定义反序列化 拦截器 位移提交 位移管理 重平衡
  • Google Gemma2 2B:语言模型的“小时代”到来?
  • 三线程顺序打印1-100
  • 中央处理器CPU
  • 用Python实现AI人脸识别
  • MSPM0G3507_2024电赛自动行驶小车(H题)_问题与感悟
  • C语言:指针(2)
  • 数组——二维数组
  • 深入 Vue 组件与状态管理的教程
  • Spring Boot 实现异步处理多个并行任务
  • TiDB系列之:使用Flink TiDB CDC Connector采集数据
  • 每日一道算法题 最接近的三数之和
  • 搭建自己的金融数据源和量化分析平台(六):下载并存储沪深两市上市公司财报
  • C语言-常见关键字详解
  • 异步编程之std::future(一): 使用
  • Vue3 + JS项目配置ESLint Pretter
  • JavaScript (十四)——JavaScript typeof和类型转换
  • CTF-web 基础
  • CP AUTOSAR标准之ChineseV2XNetwork(AUTOSAR_SWS_ChineseV2XNetwork)(更新中……)
  • 【hloc】 项目流程
  • 鸿蒙系统开发【应用接续】基本功能
  • nextTick方法的作用是什么?什么时候会用到
  • 多 NodeJS 环境管理
  • 解决网站被植入跳转木马病毒
  • Node.js(6)——npm软件包管理
  • 区块链核心概念与技术架构简介
  • ≌图概念凸显包含射线V的直线W是比V长的线
  • 子路由的配置方法?
  • 【大模型从入门到精通2】openAI api的入门介绍2