Какое выравнивание использует HeapAlloc - PullRequest
10 голосов
/ 10 мая 2010

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

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

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

Ответы [ 3 ]

5 голосов
/ 11 мая 2010

Удивительно, но Google обнаруживает свидетельство , что HeapAlloc не всегда совместим с SSE:

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

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

См. Также http://support.microsoft.com/kb/286470:

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

2 голосов
/ 11 мая 2010

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

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

Кстати, если вы используете новый оператор C ++, вы гарантированно правильно выровняете память для указанного вами типа: это может быть путь.

0 голосов
/ 11 мая 2010

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

...