- 数据结构定义
假设内存块的结构如下:
typedef struct MemoryBlock {
size_t size;
int isFree;
struct MemoryBlock* next;
} MemoryBlock;
- 合并函数实现
MemoryBlock* mergeFreeBlocks(MemoryBlock* head) {
MemoryBlock* current = head;
while (current != NULL && current->next != NULL) {
if (current->isFree && current->next->isFree) {
// 合并相邻的空闲块
current->size += current->next->size + sizeof(MemoryBlock);
current->next = current->next->next;
} else {
current = current->next;
}
}
return head;
}
- 利用指针关系运算优化性能和保证正确性
- 优化性能:
- 通过直接修改指针关系(
current->next = current->next->next;
),避免了复杂的内存移动操作。这使得合并操作时间复杂度为O(n),n为内存块的数量,无需额外的空间开销。
- 由于内存块通过指针相连,遍历内存块链表时,指针运算直接获取下一个内存块地址,减少了额外的寻址开销。
- 保证正确性:
- 在合并时,通过
current->size += current->next->size + sizeof(MemoryBlock);
更新合并后内存块的大小,确保大小信息正确。
- 在遍历链表时,每次循环检查
current != NULL && current->next != NULL
,避免空指针解引用,保证内存操作在合法的指针范围内进行。