我正在开发一个使用win32的HeapAlloc的通用库。
MSDN没有提到对win32的HeapAlloc的对齐保证,但我真的需要知道它使用了什么对齐,这样我就可以避免过度填充。
在我的机器(vista,x86)上,所有的分配都以8字节对齐。其他平台也是这样吗?
发布于 2010-05-11 04:52:11
HeapAlloc函数没有指定MSDN页面中的对齐保证,但我倾向于认为它应该具有与GlobalAlloc相同的保证,保证返回8字节对齐的内存(尽管依赖未记录的功能是邪恶的);毕竟,它明确地说,全局/局部分配只是HeapAlloc的包装器(尽管它们可能会丢弃前n个字节来获得对齐的内存-但我认为这是非常不可能的)。
如果您真的想确定,只需使用GlobalAlloc,甚至是VirtualAlloc,它的粒度是页面粒度,通常是4KB (IIRC),但在这种情况下,对于较小的分配,您将浪费大量内存。
顺便说一句,如果您使用C++ new运算符,则可以保证为您指定的类型正确地对齐内存:这可能是可行的方法。
发布于 2010-05-11 04:41:03
令人惊讶的是,谷歌在evidence上发现HeapAlloc并不总是符合SSE:
HeapAlloc()让所有对象始终8字节对齐,无论它们的大小是什么(但对于SSE,不是16字节对齐)。
这篇文章来自2008年年中,暗示最近的Windows XP存在这个错误。
另请参阅http://support.microsoft.com/kb/286470
Windows堆管理器(所有版本)始终保证堆分配的起始地址是8字节对齐的(在64位平台上,对齐是16字节)。
发布于 2021-07-14 03:25:13
Amd64堆对齐记录如下:
https://docs.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-160
...stack指针和malloc或alloca内存,它们是16字节对齐的,以提高性能。
https://stackoverflow.com/questions/2805896
复制相似问题