【问题标题】:Memory overhead in unrolled link list?展开链接列表中的内存开销?
【发布时间】:2015-12-24 03:02:40
【问题描述】:
struct listblock
{
  struct listblock*next;
  struct listnode*head;
  int countNode;
}

作者说分配其单个节点需要(12 字节 + 8 字节开销)我不明白这 8 字节开销是什么意思,他是如何计算的?

【问题讨论】:

  • 能否包含您阅读此代码的上下文?对于初学者,如果您保留对这个单个节点的引用,它将需要内存。
  • 我已经提到了主题展开的链接列表
  • 确切数量取决于您的malloc 实施。不过,4-8 字节是一个非常典型的数字。

标签: c data-structures


【解决方案1】:

当您在之前拥有malloc-ed 的对象上调用free 时,内存管理系统需要做一些“簿记”以将您返回的内存块添加回未分配内存池.具体来说,它需要知道您请求的块有多大,以便它可以在可能的情况下将realloc 放入同一个块中。实际数据特定于 malloc 的实现,但它通常包含指向由动态分配器管理的其他内存块的链接。

对于从malloc 返回给您的每个内存块,必须将簿记数据存储在某个地方。它可能存储在返回给您的内存块中,或者存储在内存分配器已知的单独位置,但至少有两个数字代表请求的大小和分配的大小。

Where Do malloc() / free() Store Allocated Sizes and Addresses?

这就是作者所说的开销:当你请求 12 个字节时,系统会给你 12 个字节,并且还用完两个 4 字节的块(块的大小和链接到下一个块)用于自己的记账,总共 20 个字节。

【讨论】:

  • 我认为没有任何理由需要跟踪请求的大小。
  • @immibis 我认为你是对的,链接的答案谈到了它(已编辑)。
猜你喜欢
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 2011-02-12
  • 2020-12-13
  • 2010-12-10
  • 2014-06-04
相关资源
最近更新 更多