一种巧妙的内存池算法(HeapBlock)

qt下写的内存池和线程调用 其实和qt无关,不过既然已经使用qt,就加上吧,无论使用qt与否,都额可以使用,限制为片元固定大小内存,非固定内存内存池可以看我的其他文章,线程调用,完整的例子。 立即下载

在一个简单的GUI库中看到的算法,非常巧妙,适用于需要频繁分配和释放相同大小数据块的情况,如GUI库中的窗口结构,SOCKET结构等,算法额外开支极小。

  1. typedef DWORD HBLOCKHEAP; 
  2. typedef unsigned char BYTE, *PBYTE; 
  3.  
  4. //使用之前需要先分配一整块内存,并调用此函数进行初始化,初始化后将形成一个链,只是这个链没有前后指针, 
  5. //指针数据保存在数据块实体数据前4字节中 
  6. HBLOCKHEAP BlockHeap_Initialize(void* buffer, int buffersize, int blocksize) 
  7. { 
  8.     PBYTE pBlock = (PBYTE)buffer; 
  9.  
  10.     for(buffersize -= blocksize; pBlock - (PBYTE)buffer < buffersize ; pBlock += blocksize) 
  11.     { 
  12.              //此处将后一块的位置保存在前一块的前4字节中,(PBYTE*)pBlock的转换只是为了将pBlock暂时解释成BYTE*,才能赋值4字节内存地址 
  13.         *(PBYTE*)pBlock = pBlock + blocksize; 
  14.          } 
  15.          *(PBYTE*)pBlock = NULL;//最后一块的下一块为空块 
  16.     return (HBLOCKHEAP)buffer;//返回此链的首块,此值需要调用者保存 
  17. } 
  18.  
  19.  
  20. //从内存池中分配数据时,直接将链首返回给调用者,同时将链首指向的下一块指定为新的链首 
  21. void* BlockHeap_Alloc(HBLOCKHEAP* pHeap) 
  22. { 
  23.     void* pBlock = (void*)(*pHeap); 
  24.  
  25.     if(pBlock) 
  26.         *pHeap =(HBLOCKHEAP)( *(PBYTE*)(*pHeap) ); 
  27.  
  28.     return pBlock; 
  29. } 
  30.  
  31.  
  32. //释放时将要释放的块指定为新的链首,并指向原链首即可 
  33. void BlockHeap_Free(HBLOCKHEAP* pHeap, void* pBlock) 
  34. { 
  35.     *(PBYTE*)pBlock = (PBYTE)(*pHeap); 
  36.     *pHeap = (HBLOCKHEAP)pBlock; 
  37. } 
  38.  
  39.  
  40.  
  41. //基本的调用示例 
  42. typedef struct{ 
  43.     int a; 
  44.     int b; 
  45.     int c; 
  46.     ... 
  47. }SOCKET, *PSOCKET; 
  48.  
  49.  
  50. static SOCKET s_sockets[100];    //先分配的内存 
  51. static HBLOCKHEAP s_hSockets;    //保存链首的变量 
  52.  
  53. //初始化并得到链首 
  54. s_hSockets = BlockHeap_Initialize(s_sockets, sizeof(s_sockets), sizeof(s_sockets[0])); 
  55. //分配内存 
  56. SOCKET *sock = BlockHeap_Alloc(&s_hSockets); 
  57.  
  58. //其它操作... 
  59.  
  60.  
  61. //释放内存 
  62. BlockHeap_Free(&s_hSockets, sock); 

deepin搭建samba服务器 一.为什么要用Samba? Samba的主要任务就是实现Linux系统和Windows系统之间的资源共享。二.需要的软件? 我是在deepin上实现的,在终端中使用一下两句命令,就可以安装Samba的软件包 $sudo apt-get install samba //安装samba 三.Samba服务的组成 Samba的核心是两个守护进程smbd和nmbd。当然,它 阅读详情

相关推荐

Ubuntu Server 24.04 安装 (超详细)

本文介绍最小化安装 Ubuntu Server的详细过程。

炀炀的专栏 1万+

HEAP: Free Heap block 0000028A24DF5A10 modified at 0000028A24DF5A50 after it was freed 正确解决方法

new了一块内存给p,使用后,delete p了,然后又给p指向的内存赋值等操作,这本身就是非法的(说明代码逻辑是有问题的),但是运行和调试阶段并不会报错,直到下次又需要new一块内存,而该内存刚好是上次我们非法使用的内存区,此时就报上面的错误了。可以看出,报错的位置,其实距离我们非法使用的语句,可能相差十万八千里了,因此非常难以定位。网上有很多博客,暴力分析自己的代码,从而找到问题语句所在,但是一个上万行的代码,可能就找非常难找到了,这里就要用的有效的调试工具了。

biao2488890051的博客 1681

【芯片驱动】2. CMT2300A配合硬件测试(灵敏度和发射功率)的软件实现

前言 在开发一款无线射频产品的时候,软件是一部分,硬件也是一部分。而决定无线收发性能的,首先是硬件的匹配电路,然后才到软件部分的优化。 一款无线射频产品,首先需要先决定是在那个频率范围内(当然是国家允许的范围内),然后硬件则需要在基于这个频点范围进行硬件的参数匹配,具体又分为发送功率匹配、天线匹配、和接收灵敏度的匹配。 现在我们使用2300a这款无线芯片来说,除非自己的团队是射频专家,则可以自己进行无线外围电路的设计外,另外一种更加快捷的方式,就是寻找原厂技术支持,他们会给...

sishuihuahua的博客 7054

malloc中 heap block 的 blocksize 大小问题

heap block 引发的思考 问题背景: Implicit Free Lists                   Any practical allocator needs some data structure that allows it to distinguish block boundaries and to distinguish between allo

Jason Leaster | Rebuilding the tower of babel 4372

注册“Oracle Provider for OLE DB”和创建链接服务器

注册“Oracle Provider for OLE DB”和创建链接服务器 在sql server 数据库上创建链接服务器,连接oracle数据库,访问接口需要设置为:“Oracle Provider for OLE DB”。 如果电脑上没有这个驱动,安装一个完整的Oracle11gR2程序是一个有效的方法,但这个64位版本的安装包有2个多G, 相当庞大,如果仅仅...

weixin_30760895的博客 2384

【AUTOSAR-COM】Transmission Mode 和 Transfer Property

1.COM模块的基本概念 首先在描述Transmission Mode 和 Transfer Property之前,有必要对COM模块的基本处理有一个直观的理解,我所描述的和对概念理解的也不一定完全正确。 Signal:指的是通信协议中的,一条报文中所保存的若干信号。 I-PDU:至少在COM模块中,可以理解为一条报文。 上图是在CANdb软件中编辑一个报文的Layout的界面,可以很形象的将I-PDU对等为这里的一条Message,而Signal就是需要在Message中需要摆放的Signal

tim_hoven的博客 4635

CString的堆错误 Heap block at

CString编程中遇到堆错误 Heap block at 00619088 modified at 006190F3 past requested size of 6   CString::GetBuffer(0)或(LPTSTR)(LPCTSTR)强制转换来的指针只能用来修改、读取,不能用strlen获取长度!

冰风火雨 3474

C语言从句柄到对象 (一) —— 全局变量的噩梦与“多实例”的救赎

本文探讨了嵌入式开发中句柄(Handle)的概念与应用。通过电机控制案例,分析了传统单例模式在扩展性上的局限,并展示了如何通过句柄实现代码复用:将电机状态封装为结构体,通过指针(句柄)传递实例数据,使同一套逻辑可操作多个实例。文章比较了单例模式与句柄模式的适用场景,建议底层驱动库默认采用句柄模式以提高扩展性。最后指出当前实现仍存在数据暴露风险,预告下期将介绍不透明指针技术实现更安全的封装。全文揭示了句柄作为C语言实现模块化和面向对象设计的关键作用。

一路往蓝-Anbo 的博客 1340

esp32 heap 内存管理简析

嵌入式系统运行时的内存情况是非常值得关注的。本文档用于分析乐鑫ESP32 SDK(版本esp-idf-v3.0-rc1) Heap (堆内存)管理的实现。 1:Heap管理主要函数接口与数据结构 1.1主要函数接口ESP32的SDK对于heap部分管理的源码位于路径\esp-idf-v3.0-rc1\components\heap下,可以简单的认为分为两层:heap_caps_init.c与hea...

abc517789065的博客 1万+

9.23华为OD机试真题 新系统 - 小菊的寻宝之旅 (Java/Py/C/C++/Js/Go)

9.23华为OD机试真题 新系统 - 小菊的寻宝之旅 (Java/Py/C/C++/Js/Go)

算法大师! 994

“华为杯“第十四届中国研究生数学建模竞赛-E题:多波次导弹发射中的规划问题(续)(附MATLAB代码实现)

将最长暴露时间的发射装置按照“优先隐蔽于转载地”,即增加该种发射装置的隐蔽时长,从而达到缩短最长暴露时间的目的。8.2 模型建立。

getusushu的博客 298

Trilinos::Belos求解库中的Block和Pseudoblock迭代算法比较

迭代算法是Krylov子空间方法的两种变体,主要区别在于如何处理多右端项(multiple right-hand sides)问题。正交化方法)进一步优化性能。实际效率需结合具体问题通过性能分析工具(如TAU或VTune)验证。在Belos线性求解器库中,建议通过Belos的。

weixin_42849849的博客 522

YOLO11改进|注意力机制篇|引入MLCA轻量级注意力机制

YOLO11中添加MLCA轻量级注意力机制

A1983Z的博客 4055

【QT】【ChatGPT】具有一点点深度的问题

具有一点点深度的、可能的QT面试问题

天启疯车 3801

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

内存池的实现思路

内存池实现的思路

北辰的博客 596

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

深入理解Qt对象树内存管理

深入理解Qt对象树内存管理

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3343

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

关于大小不变的对象的内存池管理

这是我写的一个简单的内存管理类,主要是用在:如果有种大小不变的对象要频繁的new和delete,为了防止产生大量的内存碎片和提高效率,可以考虑使用下面的内存管理类。下一篇文章,我将介绍如何使用这个类#ifndef _MEMPOOL_H#define _MEMPOOL_H/****************************************************************

David的专栏 794

Qt线程池

本文跳过第1和第2中方式,介绍后面两种。

QtCompany的博客 444

Qt的内存管理

在QT的程序中经常会看到只有new而不delete的情况,其实是因为QT有一套回收内存的机制,主要的规则如下:1.所有继承自QOBJECT类的类,如果在new的时候指定了父亲,那么它的清理时在父亲被delete的时候delete的,所以如果一个程序中,所有的QOBJECT类都指定了父亲,那么他们是会一级级的在最上面的父亲清理时被清理,而不用自己清理;2.程序通常最上层会有一个根的QOBJE

leon 1万+

19、基于共享内存的内存池

基于共享内存的内存池

编程之道在明明德在亲民在止于至善 1310

适用Linux下用于多进程的共享内存池

一个用于Linux环境下的共享内存池,专为多进程环境设计,提供快速且安全的共享内存管理以及智能的内存分配与回收机制。

yyyydzf的博客 717

内存池简单实现(一)

概念 内存池就是在程序启动时,预先向堆中申请一部分内存,交给一个管理对象。在程序运行中,需要时向管理对象“借”,不需要时“还”给管理对象。 原理很简单,关键是怎样才能高效地“借”、“还”。 实例场景 在C/S服务器中,需要频繁地收发数据包。而数据包的内存采用原始的new-delete模式,会大大降低服务器性能,所以想到了使用内存池技术。 在此实例中有几个硬性条件: 1、数据包最大长度可...

Hi, Boy 8715

qt memring固定片元内存池制作

#ifndef C_MEM_H #define C_MEM_H #include <stdint.h> #include <memory.h> #include #include #include #include #include <assert.h> enum st_status { st_read, st_write }; struct s_mem { uint8_t *v_data = NULL; int v_len = 0; std::atomic&lt

qianbo042311的博客 1507

内存池的实现

https://www.cnblogs.com/bangerlee/archive/2011/08/31/2161421.html https://www.cnblogs.com/bangerlee/archive/2011/09/01/2161437.html

wddpfx的博客 142

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 226
上一篇: 设置 QLabel 上面的 text 行间距
下一篇: 几种常用排序算法的C语言实现
风捂九天
博客等级 码龄15年 2粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值