C++内存管理:其四、使用链表实现简易版内存池

一、为什么需要内存池?

按照标准库的写法,new一个对象的时候,会malloc一块内存;delete的时候会free这块内存。频繁的malloc与free存在两个问题:
(1)耗时,这两个都是操作系统层级的函数,会相对耗时。
(2)malloc的内存中存在上下两个cookie,用来标记这块内存的起止地址,而且内存要向上取8的倍数。如果大量malloc,那么内存内存浪费还是比较惊人的。
这个问题,内存池可以很好地解决。

二、什么是内存池?

既然频繁的malloc不是一件好事情,那么我们可以一次malloc申请一大块内存。当需要new一个对象的时候,可以在已经申请好的内存里面执行构造函数。在我们delete这个对象之后,这个内存上还可以用来构造其它对象。
这就是内存池设计的基本思想:一次性申请大块内存,用于多次new对象,避免频繁的malloc与delete。

三、链表实现内存池的基本思想

你如果在中文搜索引擎上面搜索“内存池的实现”,出现最多的方法就是链表实现内存池。有一说一,这个名字取得不好,非常容易让人产生误解。比如:
用链表实现内存池,链表本来就是不连续的内存,那就说明要malloc多次,那么这个内存池有什么意义???
答案:内存池就是一次(扩容情况下多次)malloc的内存,是连续的内存。只不过将连续的内存使用链表管理起来了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/101563.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python3 -- json档案处理

import json 处理JSON文件通常涉及读取、解析和写入JSON数据的过程。下面是一些在Python中处理JSON文件的常用方法: 1. 读取JSON文件: 使用Python内置的json模块可以轻松读取JSON文件。首先,需要导入json模块并打开文件,然后使用…

前端本地存储方案-localForage-vue3中使用

前言 前端有多种本地存储方案可供选择,常见的有: Cookie:小型的文本文件,存储少量数据Web Storage :包括:localStorage和sessionStorage,存储数据有上限(5M)左右Indexe…

系统架构师备考倒计时26天(每日知识点)

详细的项目范围说明书,是项目成功的关键。 范围定义的输入包括以下内容: ① 项目章程。如果项目章程或初始的范围说明书没有在项目执行组织中使用,同样的信息需要进一步收集和开发,以产生详细的项目范围说明书。 ② 项目范围管理计划。 ③ 组…

mac M2芯片在使用Android studio 编译问题bad cpu type in executable android

由于mac的intel芯片的一些指令集没有同步在M1 M2芯片上所以需要做兼容 打开控制台(通过访达 - 应用程序 - 实用工具 - 终端 ) 输入 softwareupdate --install-rosetta 之后在输入 A 就可以了。 原产考地址:硬核!在 M1 芯…

一个非常简单的变分量子分类器 (VQC)

一、说明 在之前的帖子(这里和这里)中,我已经开始谈论 QML,为什么以及如何学习,从现在开始,我将开始分享我的研究和发现,到目前为止,这些都是非常基本的。 二、实验概述 今天&#…

学习黑马程序员JavaScript总结

今天注意学习了数据类型、运算符、常量、数组,这些内容接受的还是比较快的,因为前面学过C语言还有Python,比较不同的地方就是未定义类型undefined,这个类型是在只声明了变量但未赋值,而unll空类型它是赋了值但该值是空…

Docker-consul容器服务更新与发现

目录 一、consul简介 1、什么是服务注册与发现 2、什么是consul 3、consul的关键特性 二、consul部署 1、consul服务器部署 1.1 建立consul服务 2、查看集群信息 3、通过http api 获取集群信息 三、registrator部署 1、安装Gliderlabs/Registrator 2、测试服务发现…

常见排序算法详解

目录 排序的相关概念 排序: 稳定性: 内部排序: 外部排序: 常见的排序: 常见排序算法的实现 插入排序: 基本思想: 直…

Milvus踩坑笔记

本文用于记录在学习 Milvus文档时所遇到的一些Bug或报错及解决方法 参考文章: 官方demo:在Dynamic Schema的集合中插入数据 报错1:auto id enabled, id shouldnt in entities[0] 问题描述 此报错出现在Milvus官方在介绍 Dynamic Schema …

7.1 yolov5优化模型时,自动标注xml数据

yolov5优化模型时,一般需要继续标注一些检测错误的图片,将其标为xml数据。以下是根据训练好的模型自动标注xml数据的python代码: 注意:代码中包含了本人的yolov5的测试过程,测试过程可以自己根据yolov5的测试文件自行…

基于小波变换的分形信号r指数求解算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ................................................................... %通过功率谱密度曲线…

企业聊天应用程序使用 Kubernetes

1. 客户端-服务器工作流程 客户端:在我们的架构中,客户端可以分为三种类型:iOS 和 Android 移动应用程序以及 Web 聊天。移动应用程序首先通过 API 网关服务与服务器进行通信,其中客户端会生成一个访问令牌,该令牌将授…

华测监测预警系统 2.2 存在任意文件读取漏洞

华测监测预警系统 2.2 存在任意文件读取漏洞 一、 华测监测预警系统 2.2 简介二、漏洞描述三、影响版本四、fofa查询语句五、漏洞复现1、手动复现2、自动复现 六、修复建议 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信…

芯科蓝牙BG27开发笔记10-BG27样板调试

样板使用了1.5V电源,boost升压到1.8V供MCU使用,因此IO通信的电平需要注意: 不能使用常用的5V、3.3V的jlink进行调试,类似的uart通信也一样。 BRD4001A底板的jlink如何使用? 参考开发板套件的说明文档《ug551-brd4194…

小迈物联网网关对接串口服务器[Modbus RTU]

很多工控现场,方案中会使用串口服务器采集Modbus RTU的设备,这种情况下一般会在PC机上装上串口服务器厂家的软件来进行数据采集。如果现场不需要PC机,而是通过网关将数据传输到软件平台,如何实现呢? 本文简要介绍小迈网…

Dockerfile指令详解

如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。 Dockerfile 是一个文本文件,其内包…

【TB作品】基于MSP430G2553单片机的超声波测距与报警系统,原理图,PCB

功能: 1 超声波测距显示 2 按键设置报警上下限 3 蜂鸣器报警 原理图: PCB样式: 实物: 代码: https://github.com/xddun/blog_code_search

DC/DC开关电源学习笔记(十二)Boost升压电路仿真及工程应用案例

(十二)Boost升压电路仿真及工程应用案例 1.Boost电路仿真案例2.Boost电路工程应用实例1.Boost电路仿真案例 指标参数:输入电压5V,输出电压12V,输出电流1A,开关频率10kHz,电压纹波0.5%。 根据输入指标参数确定CCM模式下各个关键元器件测参数: 负载电阻Rl=12R 占空比D=6…

Zabbix“专家坐诊”第206期问答汇总

问题一 Q:老师,我想配置一下监控项和触发器,目前我想要三个,内存的使用情况百分比、磁盘的剩余多少G、CPU的使用情况百分比,用自带的模板修改,该怎么做? A:可以用100减去内置键值cp…

数据结构学习笔记——数据结构概论

目录 一、数据与数据元素二、数据类型和抽象数据类型三、数据结构的定义(一)逻辑结构(二)存储结构(物理结构)1、顺序存储结构2、链式存储结构3、索引存储结构4、散列存储结构 (三)数…