内存分配策略
合理的内存分配策略影响程序的性能和稳定性。根据数据的生命周期、大小和访问模式,选择合适的分配方式:栈分配、静态分配、堆分配、内存池等。
栈分配
void func(void)
{
int arr[100]; /* 栈分配,自动释放 */
/* 使用 arr */
} /* arr 自动释放 */
优点:自动管理、速度快、无碎片 缺点:大小受限(通常几 MB)、生命周期受限于作用域
静态分配
static int buffer[1000]; /* 程序生命周期 */
const char *msg = "Hello"; /* 字符串字面量 */
优点:全局可访问、无运行时开销 缺点:大小固定、可能浪费内存
堆分配
int *arr = malloc(1000 * sizeof(int));
/* 使用 */
free(arr);
优点:大小灵活、生命周期可控 缺点:手动管理、可能泄漏、有碎片
内存池
#define POOL_SIZE 1024
struct Pool {
char buffer[POOL_SIZE];
size_t used;
};
void *pool_alloc(struct Pool *pool, size_t size)
{
if (pool->used + size > POOL_SIZE)
return NULL;
void *p = pool->buffer + pool->used;
pool->used += size;
return p;
}
void pool_reset(struct Pool *pool)
{
pool->used = 0; /* 一次性释放所有 */
}
分配策略选择
| 场景 | 推荐方式 |
|---|---|
| 小数组、局部使用 | 栈分配 |
| 全局配置、常量 | 静态分配 |
| 大小未知、长期存在 | 堆分配 |
| 大量小对象、同生命周期 | 内存池 |
| 实时系统 | 预分配,禁止运行时分配 |
最佳实践
- 优先栈分配,其次静态,最后堆
- 堆分配用
sizeof计算大小 - 大量小对象用内存池
- 实时系统避免运行时分配
- 记录分配/释放模式,优化策略