c++ - 为什么 MSVC __STDCPP_DEFAULT_NEW_ALIGNMENT__ 是 16?

C++ 17 引入了 __STDCPP_DEFAULT_NEW_ALIGNMENT__,它定义了在使用非新扩展 operator new 时保证对齐。但是,std::max_align_t 是 8,这意味着基本类型的最大对齐是 8,而 __STDCPP_DEFAULT_NEW_ALIGNMENT__ 过度对齐。我的问题是为什么 MSVC 和其他编译器想要过度对齐?底层使用的任何指令都需要这种过度对齐的对齐方式吗?

之前在以下链接中提出了类似的问题:

https://stackoverflow.com/questions/56171482/why-does-the-c-standard-allow-stdmax-align-t-and-stdcpp-default-new-alignm

然而,评论只提到

“因为需要 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

相似文章

r - `dplyr` 结果在过滤和分离行时发生变化

我有关于对话问题期间学生反应的数据。瞳孔数据在A*、B*和C*列中串在一起,以*intpl_new结尾的列显示插值的瞳孔区域values,以*dur结尾的列给出每个瞳孔的持续时间观察。数据框df包含两...