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).
The documentation page got updated in the meantime, and it now gives a precise indication:
The alignment of memory returned by HeapAlloc
is MEMORY_ALLOCATION_ALIGNMENT
in WinNT.h:
#if defined(_WIN64) || defined(_M_ALPHA)
#define MEMORY_ALLOCATION_ALIGNMENT 16
#else
#define MEMORY_ALLOCATION_ALIGNMENT 8
#endif
So, it's 16 byte on 64 bit Windows, 8 on 32 bit Windows, at least on the OS versions to which the documentation refers (Windows XP onwards).
If you really want to be sure, justIn particular cases, you can also 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. this too is not really correct; until C++17, new
didn't have the necessary plumbing to deal with "over-aligned" types (i.e. types with alignment requirements greater than those for std::max_align_t
, which generally is double
), so in practice generally it just provided 8 or 16 byte alignment. This is fixed since C++17, where the new
that is provided in the standard library should be able to deal with such types. See P0035R4, std::max_align_t, std::align_val_t for more information.