HeapAlloc使用什么对齐方式

时间:2010-05-10 19:44:37

标签: c++ c alignment heapalloc

我正在开发一个使用Win32的HeapAlloc

的通用库

MSDN没有提到Win32的HeapAlloc的对齐保证,但我真的需要知道它使用的对齐方式,所以我可以避免过多的填充。

在我的机器上(vista,x86),所有分配都以8个字节对齐。这对其他平台也是如此吗?

4 个答案:

答案 0 :(得分:5)

令人惊讶的是,Google evidence提出HeapAlloc并非始终符合SSE标准:

  

HeapAlloc()使所有对象始终以8字节对齐,无论它们的大小如何(但对于SSE不是16字节对齐)。

帖子是从2008年中期开始的,这表明最近的Windows XP存在这个错误。

另见http://support.microsoft.com/kb/286470

  

Windows堆管理器(所有版本)始终保证堆分配具有8字节对齐的起始地址(在64位平台上,对齐为16字节)。

答案 1 :(得分:2)

HeapAlloc函数没有在MSDN页面中指定对齐保证,但我倾向于认为它应该具有相同的GlobalAlloc保证,保证返回8字节对齐的内存(尽管依赖于未记录的功能)是邪恶的);毕竟,它明确地说Global / LocalAlloc只是围绕HeapAlloc的包装器(虽然他们可能会丢弃第一个 n 字节以获得对齐的内存 - 但我认为这是不太可能的。)

如果你真的想确定,只需使用GlobalAlloc,甚至是VirtualAlloc,其粒度是页面粒度,通常为4 KB(IIRC),但在这种情况下,对于小分配,你会浪费大量内存

顺便说一下,如果你使用C ++ new运算符,你可以保证为你指定的类型正确地对齐内存:这可能就是这样。

答案 2 :(得分:1)

Amd64 堆对齐记录在此处:

https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-160

...堆栈指针和 malloc 或 alloca 内存,它们按 16 字节对齐以提高性能。

答案 3 :(得分:0)

对齐将使得返回的地址可以转换为任何类型的指针。否则,您将无法在应用程序中使用内存。