在链接列表的情况下,“开销”内存是指什么?

时间:2016-09-24 22:46:35

标签: python memory-management linked-list

据我所知,一个节点通常是8个字节,4个是值,4个是单个链表中的指针。

这是否意味着双链表节点在内存中有12个字节,带有两个指针?

另外这本书我正在阅读有关每12字节节点如何“开销”8字节的讨论,这是指什么?

2 个答案:

答案 0 :(得分:2)

首先,你明显在谈论32位机器,因为你的指针和值是4个字节。显然,64位机器的情况有所不同。

其次,值不需要4个字节。通常,值是指针或int,在这种情况下,它是4个字节(在32位计算机上)。但是,如果它是一个双倍,例如,它将是8个字节。实际上,有效载荷可以是任何类型,并且具有该类型的大小。

第三,你的书可能指的是两个指针 - 链接 - 作为"开销'。

第四,你的书省略了内存管理器的影响("堆管理器")。通常,由于对齐问题和堆管理问题,堆元素比实际请求的要大。当你要求12时,32位机器上的大多数堆实现都不会分配12个字节。它们将分配16个字节。 (程序不使用最后4个字节。)因为对于许多机器,机器架构要么需要8字节对齐某些值(例如,双精度),要么出于性能原因需要。您必须自己调查,因为您的特定堆实现(即编译器的运行时堆实现)会带来什么样的开销。另外,一些堆实现(很多?)实际上在分配的对象中使用内存用于其自己的簿记目的。在这种情况下,该标题量有时小到4个字节,但对于大多数需要8个字节对齐的机器来说,通常是8个字节。因此,在这种通常情况下,如果您要求12个字节,那么 实际使用 24 字节:8个字节的堆开销和12个字节的数据,以及那只有20个,所以额外的4个字节只是为了对齐!

答案 1 :(得分:0)

  

这是否意味着双链表节点在内存中有12个字节,带有两个指针?

是的,如果数据是4个字节,并且代码编译为32位而不是64位,那么每个指针4个字节。

  

另外,这本书我正在阅读有关如何8字节"开销"对于每12个字节的节点,这是指什么?

可能指的是用于2个指针的8个字节。但是可能在分配12个字节时也会引用内存管理器自身的开销。内存管理器通常必须分配比请求更多的字节,以便它们可以存储以后在释放内存时使用的跟踪信息(析构函数调用的类类型,数组元素计数等)。