Какой расклад использовать HeapAlloc

Я разрабатываю библиотеку общего назначения, которая использует Win32 HeapAlloc

MSDN не упоминает гарантии выравнивания для Heapalloc Win32, но мне действительно нужно знать, какое выравнивание он использует, поэтому я могу избежать чрезмерного заполнения.

на моей машине (vista, x86) все распределения выровнены на 8 байтах. Это верно и для других платформ?

3 ответов


функция HeapAlloc не указывает гарантии выравнивания на странице MSDN, но я склонен думать, что она должна иметь те же гарантии GlobalAlloc, которая гарантированно возвращает выровненную память 8 байтов (хотя полагаться на недокументированные функции-это зло); в конце концов, явно сказано, что Global/LocalAlloc-это просто обертки вокруг HeapAlloc (хотя они могут отбросить первый n байты для выравнивания памяти-но я думаю, что это очень вряд ли.)

Если вы действительно хотите быть уверены, просто используйте GlobalAlloc или даже VirtualAlloc, чья гранулярность-гранулярность страницы, которая обычно составляет 4 КБ (IIRC), но в этом случае для небольших выделений вы потеряете много памяти.

кстати, если вы используете оператор c++ new, вы гарантированно получите память, выровненную правильно для указанного вами типа:это может быть путь.


удивительно, Google появляется доказательства это HeapAlloc не всегда SSE-совместимый:

HeapAlloc () имеет все объекты всегда 8-байтовое выравнивание, независимо от их размера (но не 16-байтовое выравнивание для SSE).

сообщение с середины 2008 года, предполагая, что недавняя Windows XP страдает от этой ошибки.

Смотрите также http://support.microsoft.com/kb/286470:

кучи Windows менеджеры (все версии) всегда гарантировали, что распределения кучи имеют начальный адрес, выровненный по 8 байтам (на 64-разрядных платформах выравнивание составляет 16 байтов).


расклад будет такой, что возвращаемый адрес может быть приведен к указателю любого типа. В противном случае вы не сможете использовать память в своем приложении.