What alignment does HeapAlloc use
I'm developing a general purpose library开发者_StackOverflow which uses Win32's HeapAlloc
MSDN doesn't mention alignment guarantees for Win32's HeapAlloc, but I really need to know what alignment it uses, so I can avoid excessive padding.
On my machine (vista, x86), all allocations are aligned at 8 bytes. Is this true for other platforms as well?
Surprisingly, Google turns up evidence that HeapAlloc
is not always SSE-compliant:
HeapAlloc() has all the objects always 8-byte aligned, no matter what their size is (but not 16-byte-aligned, for SSE).
The post is from mid 2008, suggesting that recent Windows XP suffers from this bug.
See also http://support.microsoft.com/kb/286470:
The Windows heap managers (all versions) have always guaranteed that the heap allocations have a start address that is 8-byte aligned (on 64-bit platforms the alignment is 16-bytes).
The HeapAlloc function does not specify the alignment guarantees in the MSDN page, but I'm inclined to think that it should have the same guarantees of GlobalAlloc, which is guaranteed to return memory 8-byte aligned (although relying on undocumented features is evil); after all, it's explicitly said that Global/LocalAlloc are just wrappers around HeapAlloc (although they may discard the first n bytes to get aligned memory - but I think that it's very unlikely).
If you really want to be sure, just use GlobalAlloc, or even VirtualAlloc, whose granularity is the page granularity, which is usually 4 KB (IIRC), but in this case for small allocations you'll waste a lot of memory.
By the way, if you use C++ new operator, you are guaranteed to get memory aligned correctly for the type you specified: this could be the way to go.
Amd64 heap alignment is documented here:
https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention?view=msvc-160
...stack pointer and malloc or alloca memory, which are 16-byte aligned to aid performance.
The alignment will be such that the returned address can be cast to a pointer of any type. Otherwise you will not be able to use the memory in your application.
精彩评论