汇编 - 堆对齐 - x86 英特尔

Assembly - Heap alignment - x86 intel

我想我理解堆栈对齐是4个字节,例如如果我只添加一个char,他的地址将在4个字节的右边(如果还有其他1或2个字节的变量则稍早一些) )

我仍然无法理解堆中的对齐方式,我认为有 4 个字节或 8 个字节的对齐方式,但事情是这样的,当我分配 100 个然后 20 个字节时,堆的末尾之间有 4 个字节第一个和第二个的开头,所以我猜堆会使用 8bytes 对齐。

通过连续分配 1 4 7 8 9 14 16 17 个字节,我注意到 1、4、7、8、9 每个占用 16 个字节,而 14 16 17 占用 24 个字节,为什么这样?

我正在使用 C/C++ 并使用 malloc 进行分配(与 new 相同)。

谢谢。

在 Windows 上,malloc 函数记录在 return 内存中,对于 32 位应用程序,内存对齐在 8 字节边界上,对于 64 位应用程序,内存对齐在 16 字节边界上位应用程序。在 Linux 上,它只说它 return 是“适合任何类型变量对齐的内存”,但它可能也是 8 和 16。

最重要的是,malloc 需要预留额外的内存来存储管理堆所需的跟踪数据。这意味着当您要求 N 个字节时,malloc 实际上将使用 N+X 个字节,其中 X 是常量并取决于实现。

对齐只是关于某物开始的位置:它的地址将是 A 的倍数。内存管理器将这些分配放在哪里,以及为什么,完全是它的业务,并且可能(部分)取决于程序之外计算机中发生的其他事情。这意味着您无法通过 "next" 的位置来确定先前分配的 "size" (虽然它可能在您的程序旁边,但可能不在内存管理器旁边);事实上,"next" 分配有可能有一个 更小的 地址(例如,如果在此期间释放了较低的内存)。