新手上路
- 积分
- 35
- 金钱
- 35
- 注册时间
- 2019-5-21
- 在线时间
- 10 小时
|
本帖最后由 skyate 于 2020-1-11 17:35 编辑
最近在做一个项目由于需要经常申请、释放小块内存导致明明内存占用率不高,但是却无法分配出可用内存块。所以思考了一些关于内存碎片整理的问题。我在论坛里搜索了一下大家关于内存碎片整理的讨论,发现主要集中在修改已经分配了内存的指针P,让P指向新的地址,从而实现移动P指向内存块的位置,将P指向的内存块前后的碎片内存整合成一个大片的内存。
在原子哥的内存管理里是使用下面这种方式申请内存的
- void *mymalloc(u8 memx,u32 size)
- void *P = mymalloc(SRAMIN,16);
复制代码 内存管理模块无法去再次修改P指针指向的内存地址。
若内存管理模块在申请内存时可以获取P指针的地址(&P),并将P指针的地址保存。P指针的地址所指向的存储空间保存的时P指针指向的地址。
这样在进行内存整理时,重新修改P指针的地址所指向的空间的内容即可修改P指针的指向。
- void **PP; //假设申请内存时,&P被保存在这。
- void mymalloc2(u8 memx,void **ptr,u32 size)
- {
- *PP = *ptr;
- *ptr = mymalloc(memx,size);
- }
- void *P;
- mymalloc2(SRAMIN,&P,16);
复制代码
这样在申请内存时,内存管理模块即可获取指针P所指向的地址。
假设申请内存时P = 0X12345678;
那重分配时,可通过*PP = 0X87654321;将P指针指向的地址修改成0X87654321;
|
|