首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HeapAlloc使用什么对齐方式

HeapAlloc使用什么对齐方式
EN

Stack Overflow用户
提问于 2010-05-11 03:44:37
回答 4查看 5.3K关注 0票数 10

我正在开发一个使用win32的HeapAlloc的通用库。

MSDN没有提到对win32的HeapAlloc的对齐保证,但我真的需要知道它使用了什么对齐,这样我就可以避免过度填充。

在我的机器(vista,x86)上,所有的分配都以8字节对齐。其他平台也是这样吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-11 04:52:11

HeapAlloc函数没有指定MSDN页面中的对齐保证,但我倾向于认为它应该具有与GlobalAlloc相同的保证,保证返回8字节对齐的内存(尽管依赖未记录的功能是邪恶的);毕竟,它明确地说,全局/局部分配只是HeapAlloc的包装器(尽管它们可能会丢弃前n个字节来获得对齐的内存-但我认为这是非常不可能的)。

如果您真的想确定,只需使用GlobalAlloc,甚至是VirtualAlloc,它的粒度是页面粒度,通常是4KB (IIRC),但在这种情况下,对于较小的分配,您将浪费大量内存。

顺便说一句,如果您使用C++ new运算符,则可以保证为您指定的类型正确地对齐内存:这可能是可行的方法。

票数 2
EN

Stack Overflow用户

发布于 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字节)。

票数 6
EN

Stack Overflow用户

发布于 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字节对齐的,以提高性能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2805896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档