C++ 17 引入了 __STDCPP_DEFAULT_NEW_ALIGNMENT__
,它定义了在使用非新扩展 operator new
时保证对齐。但是,std::max_align_t
是 8,这意味着基本类型的最大对齐是 8,而 __STDCPP_DEFAULT_NEW_ALIGNMENT__
过度对齐。我的问题是为什么 MSVC 和其他编译器想要过度对齐?底层使用的任何指令都需要这种过度对齐的对齐方式吗?
之前在以下链接中提出了类似的问题:
然而,评论只提到
“因为需要 16 字节对齐的类型在 C++ 的默认 new 提供明确请求分配此类对齐的机制之前已经存在了十多年。为了允许用户使用此类类型,Microsoft 决定使其默认分配器始终返回16 字节对齐的指针。”
我想知道“此类类型”的详细说明是什么?
回答1
MSVC 将 __STDCPP_DEFAULT_NEW_ALIGNMENT__
定义为 16,因为它的 operator new
提供了这种对齐保证。
在 MSVC 上,operator new
最终调用 https://docs.microsoft.com/en-us/windows/win32/api/heapapi/nf-heapapi-heapalloc,根据文档,在 Win64 上 HeapAlloc
返回的内存对齐是 16。
HeapAlloc
返回的内存对齐方式是WinNT.h中的MEMORY_ALLOCATION_ALIGNMENT
:#if defined(_WIN64) || defined(_M_ALPHA) #define MEMORY_ALLOCATION_ALIGNMENT 16 #else #define MEMORY_ALLOCATION_ALIGNMENT 8 #endif