内存管理:原理、实现与常见错误解析
1. 动态内存分配设计要点
在选择允许动态分配的解决方案时,需要考虑以下重要因素:
- 堆所在区域的几何形状
- 若堆与栈共享,需确定堆部分的上边界,以防止堆 - 栈冲突
- 当没有足够内存满足新分配请求时应采取的策略
- 如何处理内存碎片,并尽量减少未使用块的开销
- 使用单独的内存池来分离特定对象和模块使用的内存
- 将单个内存池分散到非连续区域
2. 自定义内存分配实现
在裸机嵌入式系统中,堆通常是一个或多个连续的物理内存区域,可以使用任何对齐方式在内部进行划分。基于 malloc/free 接口构建基于堆的内存分配,需要跟踪内存中请求的分配情况。通常的做法是在每个分配的前面附加一个小的头部,以跟踪分配部分的状态和大小。以下是一个基本实现:
struct malloc_block {
unsigned int signature;
unsigned int size;
};
#define SIGNATURE_IN_USE (0xAAC0FFEE)
#define SIGNATURE_FREED (0xFEEDFACE)
#define NULL (((void *)0))
void *malloc(unsigned int size)
{
static unsigned int *end_heap = 0;
struct malloc_block *blk;
char *ret = NULL;
if (!end_heap)
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



