简易内存池(下)

提示:文章

文章目录

  • 前言
  • 一、背景
  • 二、
    • 2.1
    • Ace代码
  • 三、
    • 3.1
  • 总结

前言

前期疑问:
本文目标:


一、背景

最近

二、

2.1

Ace代码

Aced代码形式如下

#include <stdbool.h>
#include <stdio.h>
#include <malloc.h>
#include "securec.h"typedef struct {int start;int end;
} MemoryUint;typedef struct {bool status;int index;
} HashMap;typedef struct {MemoryUint memoryUint[101];HashMap hashMap[101];int hashCount;int unitCount;int memLeftSize;int totalMemorySize;
} MemSystem;static int compare(const void* a, const void* b)
{return ((HashMap*) a)->index - ((HashMap*) b)->index;
}// 注意:该函数为类构造函数,返回的对象指针将作为其他待实现函数的入参;框架代码在调用该函数后,会输出 null(而非指针)
static MemSystem* MemSystemCreate(int space)
{MemSystem* sys = (MemSystem*) malloc(sizeof(MemSystem));if (sys == NULL) {return NULL;}memset_s(sys->memoryUint, sizeof(sys->memoryUint), 0, sizeof(sys->memoryUint));memset_s(sys->hashMap, sizeof(sys->hashMap), 0, sizeof(sys->hashMap));sys->totalMemorySize = space;sys->memLeftSize = space;sys->hashCount = 0;sys->unitCount = 0;return sys;
}static int MemSystemRequest(MemSystem* sys, int size)
{if(sys->totalMemorySize < size){return -1;}if (size == 0) {return -1;}if (sys->hashCount == 0) {sys->memoryUint[0].start = 0;sys->memoryUint[0].end = sys->memoryUint[0].end + size;sys->hashMap[0].status = true;sys->hashMap[0].index = sys->memoryUint[0].start;sys->hashCount += 1;return sys->memoryUint[0].start;}for (int i = 0; i < sys->hashCount; i++) {if (sys->hashMap[i].status == true) {int spareMemSize = 0;if (sys->hashCount == 1) {if (sys->memoryUint[sys->hashMap[0].index].start >= size) {sys->memoryUint[0].start = 0;sys->memoryUint[0].end = sys->memoryUint[0].start + size;sys->hashMap[sys->hashCount].status = true;sys->hashMap[sys->hashCount].index = sys->memoryUint[0].start;sys->hashCount += 1;qsort(sys->hashMap, sys->hashCount, sizeof(HashMap), compare);return sys->memoryUint[0].start;}spareMemSize = sys->totalMemorySize - sys->memoryUint[sys->hashMap[0].index].end;} else {if (sys->memoryUint[sys->hashMap[0].index].start >= size) {sys->memoryUint[0].start = 0;sys->memoryUint[0].end = sys->memoryUint[0].start + size;sys->hashMap[sys->hashCount].status = true;sys->hashMap[sys->hashCount].index = sys->memoryUint[0].start;sys->hashCount += 1;qsort(sys->hashMap, sys->hashCount, sizeof(HashMap), compare);return sys->memoryUint[0].start;}int lastMemInfo = 0;if (sys->hashMap[i + 1].status == false) {lastMemInfo = sys->totalMemorySize;} else {lastMemInfo = sys->hashMap[i + 1].index;}spareMemSize = lastMemInfo - sys->memoryUint[sys->hashMap[i].index].end;}if (spareMemSize >= size) {sys->memoryUint[sys->memoryUint[sys->hashMap[i].index].end].start = sys->memoryUint[sys->hashMap[i].index].end;sys->memoryUint[sys->memoryUint[sys->hashMap[i].index].end].end =sys->memoryUint[sys->memoryUint[sys->hashMap[i].index].end].start + size;if (sys->hashMap[i + 1].status == false) {sys->hashMap[i + 1].status = true;sys->hashMap[i + 1].index = sys->memoryUint[sys->memoryUint[sys->hashMap[i].index].end].start;} else {// 在中间申请内存,hash表中间插入一个key值for (int j = sys->hashCount - 1; j > i; j--) {bool status = sys->hashMap[j].status;int index = sys->hashMap[j].index;sys->hashMap[j + 1].status = status;sys->hashMap[j + 1].index = index;}sys->hashMap[i + 1].status = true;sys->hashMap[i + 1].index = sys->memoryUint[sys->memoryUint[sys->hashMap[i].index].end].start;}sys->hashCount += 1;return sys->memoryUint[sys->memoryUint[sys->hashMap[i].index].end].start;}}}return -1;
}static bool MemSystemRelease(MemSystem* sys, int addr)
{for (int i = 0; i < sys->hashCount; i++) {if (sys->hashMap[i].status == true) {if (sys->memoryUint[sys->hashMap[i].index].start == addr) {sys->memoryUint[sys->hashMap[i].index].start = 0;sys->memoryUint[sys->hashMap[i].index].end = 0;sys->hashMap[i].status = false;sys->hashMap[i].index = 0;for (int j = i; j < sys->hashCount; j++) {bool status = sys->hashMap[j + 1].status;int index = sys->hashMap[j + 1].index;sys->hashMap[j].status = status;sys->hashMap[j].index = index;}sys->hashMap[sys->hashCount].status = false;sys->hashMap[sys->hashCount].index = 0;sys->hashCount -= 1;return true;}}}return false;
}static void MemSystemFree(MemSystem* sys)
{free(sys);
}

降低圈复杂度和嵌套深度,优化代码如下

#include <stdbool.h>
#include <stdio.h>
#include <malloc.h>
#include "securec.h"typedef struct {int start;int end;
} MemoryUint;typedef struct {bool status;int index;
} HashMap;typedef struct {MemoryUint memoryUint[101];HashMap hashMap[101];int hashCount;int unitCount;int memLeftSize;int totalMemorySize;
} MemSystem;static int compare(const void* a, const void* b)
{return ((HashMap*) a)->index - ((HashMap*) b)->index;
}static bool GetStartWhileStartAddrLargerThenRequestSize(MemSystem* sys, int size, int* start)
{if (sys->memoryUint[sys->hashMap[0].index].start >= size) {sys->memoryUint[0].start = 0;sys->memoryUint[0].end = sys->memoryUint[0].start + size;sys->hashMap[sys->hashCount].status = true;sys->hashMap[sys->hashCount].index = sys->memoryUint[0].start;sys->hashCount += 1;qsort(sys->hashMap, sys->hashCount, sizeof(HashMap), compare);*start = sys->memoryUint[0].start;return true;}return false;
}static int GetStartWhileMemoryIsAvailable(MemSystem* sys, int size, int i)
{sys->memoryUint[sys->memoryUint[sys->hashMap[i].index].end].start = sys->memoryUint[sys->hashMap[i].index].end;sys->memoryUint[sys->memoryUint[sys->hashMap[i].index].end].end =sys->memoryUint[sys->memoryUint[sys->hashMap[i].index].end].start + size;if (sys->hashMap[i + 1].status == false) {sys->hashMap[i + 1].status = true;sys->hashMap[i + 1].index = sys->memoryUint[sys->memoryUint[sys->hashMap[i].index].end].start;} else {// 在中间申请内存,hash表中间插入一个key值for (int j = sys->hashCount - 1; j > i; j--) {bool status = sys->hashMap[j].status;int index = sys->hashMap[j].index;sys->hashMap[j + 1].status = status;sys->hashMap[j + 1].index = index;}sys->hashMap[i + 1].status = true;sys->hashMap[i + 1].index = sys->memoryUint[sys->memoryUint[sys->hashMap[i].index].end].start;}sys->hashCount += 1;return sys->memoryUint[sys->memoryUint[sys->hashMap[i].index].end].start;
}// 注意:该函数为类构造函数,返回的对象指针将作为其他待实现函数的入参;框架代码在调用该函数后,会输出 null(而非指针)
static MemSystem* MemSystemCreate(int space)
{MemSystem* sys = (MemSystem*) malloc(sizeof(MemSystem));if (sys == NULL) {return NULL;}memset_s(sys->memoryUint, sizeof(sys->memoryUint), 0, sizeof(sys->memoryUint));memset_s(sys->hashMap, sizeof(sys->hashMap), 0, sizeof(sys->hashMap));sys->totalMemorySize = space;sys->memLeftSize = space;sys->hashCount = 0;sys->unitCount = 0;return sys;
}static int MemSystemRequest(MemSystem* sys, int size)
{if (sys->totalMemorySize < size) {return -1;}if (size == 0) {return -1;}if (sys->hashCount == 0) {sys->memoryUint[0].start = 0;sys->memoryUint[0].end = sys->memoryUint[0].end + size;sys->hashMap[0].status = true;sys->hashMap[0].index = sys->memoryUint[0].start;sys->hashCount += 1;return sys->memoryUint[0].start;}for (int i = 0; i < sys->hashCount; i++) {if (sys->hashMap[i].status == true) {int spareMemSize = 0;if (sys->hashCount == 1) {int start = 0;if(GetStartWhileStartAddrLargerThenRequestSize(sys, size, &start)){return start;}spareMemSize = sys->totalMemorySize - sys->memoryUint[sys->hashMap[0].index].end;} else {int start = 0;if(GetStartWhileStartAddrLargerThenRequestSize(sys, size, &start)){return start;}int lastMemInfo = 0;if (sys->hashMap[i + 1].status == false) {lastMemInfo = sys->totalMemorySize;} else {lastMemInfo = sys->hashMap[i + 1].index;}spareMemSize = lastMemInfo - sys->memoryUint[sys->hashMap[i].index].end;}if (spareMemSize >= size) {int start = 0;start = GetStartWhileMemoryIsAvailable(sys, size, i);return start;}}}return -1;
}static bool MemSystemRelease(MemSystem* sys, int addr)
{for (int i = 0; i < sys->hashCount; i++) {if (sys->hashMap[i].status == true) {if (sys->memoryUint[sys->hashMap[i].index].start == addr) {sys->memoryUint[sys->hashMap[i].index].start = 0;sys->memoryUint[sys->hashMap[i].index].end = 0;sys->hashMap[i].status = false;sys->hashMap[i].index = 0;for (int j = i; j < sys->hashCount; j++) {bool status = sys->hashMap[j + 1].status;int index = sys->hashMap[j + 1].index;sys->hashMap[j].status = status;sys->hashMap[j].index = index;}sys->hashMap[sys->hashCount].status = false;sys->hashMap[sys->hashCount].index = 0;sys->hashCount -= 1;return true;}}}return false;
}static void MemSystemFree(MemSystem* sys)
{free(sys);
}

三、

3.1


总结

未完待续

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

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

相关文章

TB1801D 线性驱动 LED 恒流芯片

1、产品概述 TB1801D是一款专为12V灯珠设计的汽车灯专用的低压差恒流芯片&#xff0c;输出电流恒流精度≤3&#xff05;&#xff0c;外围结构简单。TB1801D 内置 130℃过温保护电路&#xff0c;可在各种散热条件下将 LED 灯珠温度控制在 140℃以内。TB1801D 内置 100V 的功率 M…

HTML——38.Span标签和字符实体

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>span标签和字符实体</title><style type"text/css">h1{text-align: center;}p{text-indent: 2em;}span{color: red;}</style></head><…

纯血鸿蒙ArkUI线性布局详解

线性布局说明 线性布局&#xff08;LinearLayout&#xff09;是开发中最常用的布局&#xff0c;通过线性容器Row和Column构建。线性布局是其他布局的基础&#xff0c;其子元素在线性方向上&#xff08;水平方向和垂直方向&#xff09;依次排列。线性布局的排列方向由所选容器组…

Debian-linux运维-docker安装和配置

腾讯云搭建docker官方文档&#xff1a;https://cloud.tencent.com/document/product/213/46000 阿里云安装Docker官方文档&#xff1a;https://help.aliyun.com/zh/ecs/use-cases/install-and-use-docker-on-a-linux-ecs-instance 天翼云常见docker源配置指导&#xff1a;htt…

【网络安全实验室】脚本关实战详情

难道向上攀爬的那条路&#xff0c;不是比站在顶峰更让人热血澎湃吗 1.key又又找不到了 点击链接&#xff0c;burp抓包&#xff0c;发送到重放模块&#xff0c;点击go 得到key 2.快速口算 python3脚本 得到key 3.这个题目是空的 试了一圈最后发现是 4.怎么就是不弹出key呢…

极品飞车6的游戏手柄设置

极品飞车&#xff0c;既可以用键盘来控制车辆的前进、后退、左转、右转、加速与减速&#xff0c;也可以使用游戏手柄来操作车辆的运行。需要注意的是&#xff0c;极品飞车虽然支持手柄&#xff0c;但是仅支持常见的北通、罗技还有部分Xbox系列的手柄&#xff0c;至于其他的PS4手…

安科瑞防孤岛保护装置助力光储充系统安全运行

安科瑞 吕梦怡 ​1.孤岛效应是指在电网供电系统中出现的一种异常情况。 当公共电网因故障停电或者其他原因断电时&#xff0c;原本接入电网的分布式发电系统&#xff08;如太阳能电站、风力发电场&#xff09;如果没有及时与电网断开&#xff0c;就会继续向其周围的一部分用电…

联通 路由器 创维SK-WR9551X 联通华盛VS010 组mesh 和 锐捷X32 PRO 无缝漫游

前言 联通路由器&#xff1a;联通创维SK-WR9551X&#xff0c;联通华盛VS010组mesh&#xff0c;并与锐捷X32 PRO混合组网&#xff0c;开启无限漫游。 1、mesh ≠ 无缝漫游 mesh是实现路由器快速组网的一种方式&#xff0c;通过mesh组网后可以实现无缝漫游。 mesh组网的设备要…

Druid连接Oracle数据库,连接失效导致SQL无法执行

原始配置&#xff1a; type: com.alibaba.druid.pool.DruidDataSource druid:initial-size: 5max-active: 25min-idle: 5max-wait: 10000testWhileIdle: truetestOnBorrow: falsetestOnReturn: falsetimeBetweenEvictionRunsMillis: 2000minEvictableIdleTimeMillis: 600000ma…

JVM调优(内存、GC、JVM参数)

内存调优 常用监控工具 Top命令 top命令是linux下用来查看系统信息的一个命令&#xff0c;它提供给我们去实时地去查看系统的资源&#xff0c;比如执行时的进程、线程和系统参数等信息。进程使用的内存为RES&#xff08;常驻内存&#xff09;- SHR&#xff08;共享内存&…

Cursor登录按钮点击没反应

问题 系统&#xff1a;Windows11 Cursor&#xff1a;Cursor 0.44.9 当安装Cursor打开进行登录时&#xff0c;点击Sign in没反应 解决方案 1.打开window11的设置 2.点击应用中的默认应用 3.在设置应用程序的默认值中搜索Google&#xff08;没有Google浏览器的尝试下载一个&a…

强化学习(1)

Reinforcement Learning Goal-directed learing from ineraction with the environment. 1. Basic Element 基本元素 1.1 Agent 玩家 1.2 Environment 1.3 Goal 2. Main Element 主要元素 2.1 State 2.2 Action 状态与行为往复 2.3 Reward 目标&#xff1a;最大化总…

异步请求在TypeScript网络爬虫中的应用

异步请求的重要性 异步请求是现代网络应用中不可或缺的一部分&#xff0c;特别是在网络爬虫领域。它允许爬虫在等待网络响应的同时继续执行其他任务&#xff0c;从而提高效率和性能。在JavaScript和TypeScript中&#xff0c;异步请求可以通过多种方式实现&#xff0c;包括回调…

OpenLinkSaas使用手册-项目外部资源管理

在软件项目开发过程中&#xff0c;会依赖很多外部系统&#xff0c;比如服务器&#xff0c;代码仓库&#xff0c;CI/CD&#xff0c;构件仓库等等。 OpenLinkSaas可以在右侧工具栏中的服务列表中&#xff0c;添加这些外部资源。 进入外部服务列表 代码仓库 一个软件项目可能会…

自建私有云相册:Docker一键部署Immich,照片视频备份利器

自建私有云相册&#xff1a;Docker一键部署Immich&#xff0c;照片视频备份利器 前言 随着人们手机、PC、平板等电子产品多样&#xff0c;我们拍摄和保存的照片和视频数量也在不断增加。如何高效地管理和备份这些珍贵的记忆成为了一个重要的问题。 传统的云备份虽然方便&…

ArcGIS教程(009):ArcGIS制作校园3D展示图

文章目录 数据下载校园3D展示图制作创建要素类矢量化【楼】要素矢量化【绿地】矢量化【范围】矢量化处理打开ArcScene添加动画数据下载 https://download.csdn.net/download/WwLK123/90189025校园3D展示图制作 创建要素类 添加底图: 新建【文件地理数据库】,并修改名称为【…

Windows安装了pnpm后无法在Vscode中使用

Windows安装了pnpm后无法在Vscode中使用 解决方法&#xff1a; 以管理员身份打开 PowerShell 并执行以下命令后输入Y回车即可。 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser之后就可以正常使用了

OpenHarmony源码编译后烧录镜像教程,RK3566鸿蒙开发板演示

本文介绍瑞芯微主板/开发板编译OpenHarmony源码后烧录镜像的教程&#xff0c;触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器&#xff0c;树莓派卡片电脑设计&#xff0c;支持开源鸿蒙OpenHarmony3.2-5.0系统&#xff0c;适合鸿蒙开发入门学习。 编译源码…

【MATLAB APP Designer】小波阈值去噪(第一期)

代码原理及流程 小波阈值去噪是一种信号处理方法&#xff0c;用于从信号中去除噪声。这种方法基于小波变换&#xff0c;它通过将信号分解到不同的尺度和频率上来实现。其基本原理可以分为以下几个步骤&#xff1a; &#xff08;1&#xff09;小波变换&#xff1a;首先对含噪信…

关于埃斯顿机器人指令含义

等待一组数字量输入指令&#xff0c;用于多个输入数字量的指示&#xff01; DO8421(9.17.0)该指令含义为将9-17端口的虚信号输出为0 (图1) (CALL指令) 子程序调用指令&#xff0c;用于程序中调用子程序 (SetSimDO指令) 设置虚拟数字量输出指令&#xff0c;用于程序中设置虚…