汇编 - 堆对齐 - x86 intel

标签 assembly malloc alignment heap-memory memory-alignment

我想我理解了4字节的堆栈对齐,例如,如果我只添加一个字符,他的地址将位于4字节的右侧(如果还有其他1或2字节变量,则稍早一点)

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

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

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

谢谢。

最佳答案

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

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

关于汇编 - 堆对齐 - x86 intel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32229211/

相关文章:

c++ - 如何打印出 Visual Studio 跟踪点中的寄存器偏移量?

assembly - 计算设置的位数

malloc - 为二进制程序启用 mtrace (MALLOC_TRACE)

c - 需要将内存对齐到 2 的幂,并将程序中断对齐到 2 * getpagesize() 的倍数(C 中)

image - 段落下方的 CSS 对齐图像

将各个程序集转换为机器代码

c - 如何在函数外传递二维指针,使指针指向的内存可以访问?

css - 将文本基线与 CSS 中的按钮对齐

css - 右边的菜单项(左边距问题)

debugging - 为什么 SASM 的调试器在存储后不显示 "result"变量更新的值?