我正在开发一个使用Win32的HeapAlloc
的通用库 MSDN没有提到Win32的HeapAlloc的对齐保证,但我真的需要知道它使用的对齐方式,所以我可以避免过多的填充。在我的机器上(vista,x86),所有分配都以8个字节对齐。这对其他平台也是如此吗?
答案 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)
对齐将使得返回的地址可以转换为任何类型的指针。否则,您将无法在应用程序中使用内存。