MST
星途 面试题库

面试题:C++ 内存池实现中的内存分配策略

在C++ 内存池的实现中,常见的内存分配策略有哪些?请简要描述每种策略的原理,并说明各自的优缺点。
33.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

固定大小块分配策略

  • 原理:将内存池划分为若干固定大小的内存块,每个块大小预先设定且固定不变。当有内存分配请求时,直接从对应大小的空闲块链表中取出一块分配给用户;释放时,将该块重新链入对应大小的空闲块链表。
  • 优点:分配和释放速度快,因为无需复杂的查找和分割操作;内存碎片问题相对较轻,由于块大小固定,不会产生小的无法利用的碎片。
  • 缺点:灵活性差,只能满足特定大小的内存请求;若请求大小与预设块大小不匹配,会造成内存浪费,例如请求较小内存但只能分配固定大小的较大块。

可变大小块分配策略

  • 原理:内存池中的块大小可根据实际分配请求动态调整。分配时,从空闲块列表中查找合适大小的块,若没有则可能分割较大块;释放时,将释放的块尝试与相邻空闲块合并以减少碎片。
  • 优点:能适应各种大小的内存请求,灵活性高,内存利用率相对较高。
  • 缺点:分配和释放操作复杂,需进行查找、分割、合并等操作,导致速度较慢;容易产生内存碎片,随着分配和释放操作的进行,内存空间会被分割成许多小的不连续块,影响后续的分配效率。

伙伴系统分配策略

  • 原理:内存池被视为一个完整的大内存块,该块大小通常是2的幂次方。当有分配请求时,从大到小查找合适的空闲块,若找到的块过大则分裂为两个相等大小的“伙伴”块,其中一块分配出去,另一块留在空闲列表;释放时,检查释放块的伙伴是否也空闲,若空闲则合并为更大的块。
  • 优点:内存碎片相对较少,通过伙伴合并机制可有效减少碎片化;分配和释放操作相对高效,由于基于2的幂次方大小管理内存块,查找和合并操作相对简单。
  • 缺点:只能分配2的幂次方大小的内存块,限制了灵活性;对于非2的幂次方大小的请求,可能需要额外处理,如向上取整到最接近的2的幂次方大小,造成一定内存浪费。