gpt4 book ai didi

c++ - __STDCPP_DEFAULT_NEW_ALIGNMENT__ 出现之前的年龄是多少

转载 作者:行者123 更新时间:2023-12-05 06:51:40 38 4
gpt4 key购买 nike

以Windows为例,__STDCPP_DEFAULT_NEW_ALIGNMENT__为16。当我重写 new 运算符时,编译器调用非对齐版本 new。这表明编译器假定 new 运算符应分配内存对齐到 16。(如果我已经错了,请纠正我)。

然而 __STDCPP_DEFAULT_NEW_ALIGNMENT__ 自 C++17 出现?我想知道 C++17 之前的老年是什么。重写新运算符时是否将内存对齐到特定字节?

我正在研究一个内存分配器,它在初始化时有一个预分配的内存块。理论上,我可以通过任何对齐方式返回内存。但是当请求新的整数时对齐到 3 肯定是不正确的。所以我将最小对齐设置为 __STDCPP_DEFAULT_NEW_ALIGNMENT__。但是我要处理一个编译器为 C++ 14 的旧项目。我应该对我的分配器应用什么对齐方式?

第二个问题一直萦绕在我的脑海中,为什么 __STDCPP_DEFAULT_NEW_ALIGNMENT__ 在 Windows 上是 16?为什么它不能等于 std::max_align?我见过一些平台甚至是32。但为什么?一些解释说有些指令需要对齐到 16 或 32。你能举个例子吗?

最佳答案

自 C++17 起,内存分配函数保证返回的指针为:

suitably aligned so that it can be converted to a pointer of any complete object type with a fundamental alignment requirement.

这意味着,返回的内存块将至少对齐到 alignof(std::max_align_t) 字节。

然而,它也可以更严格地对齐。为什么?因为C++实现需要在内部使用一些系统分配机制,比如malloc。如果 malloc 返回一个 16 字节对齐的指针,则 C++ 实现无权更改它。在这种情况下,__STDCPP_DEFAULT_NEW_ALIGNMENT__ 将为 16。

但是基本对齐不一定是 16。例如,它可能是 8。IIRC,这是带有 MSVC 的 64 位 Windows 的情况,其中 long double 是 64 位(与 double 相同)。然后,__STDCPP_DEFAULT_NEW_ALIGNMENT__ 为 16,因此不同于 alignof(std::max_align_t),后者为 8。

现场演示:https://godbolt.org/z/M1c64f

What alignment should I apply to my allocator?

您应该应用alignof(std::max_align_t)。从 C++17 开始,这将保证支持所有具有最基本对齐要求的数据类型(与 operator new 相同)。

关于c++ - __STDCPP_DEFAULT_NEW_ALIGNMENT__ 出现之前的年龄是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66118799/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com