gpt4 book ai didi

c++ - __STDCPP_DEFAULT_NEW_ALIGNMENT__ 和alignof(std::max_align_t)之间的顺序

转载 作者:行者123 更新时间:2023-12-02 03:03:44 25 4
gpt4 key购买 nike

在 x86-64/Linux 上使用 GCC 和 Clang alignof(std::max_align_t)__STDCPP_DEFAULT_NEW_ALIGNMENT__都等于16 .

在 x86-64/Windows 上使用 MSVC alignof(std::max_align_t)8__STDCPP_DEFAULT_NEW_ALIGNMENT__16 .

该标准在[basic.align]/3中定义了与这些数量相对应的两个术语。 :

An extended alignment is represented by an alignment greater than alignof(std​::​max_­align_­t). [...] A type having an extended alignment requirement is an over-aligned type. [...] A new-extended alignment is represented by an alignment greater than _­_­STDCPP_­DEFAULT_­NEW_­ALIGNMENT_­_­.

我不认为这意味着两个值之间有任何顺序,除非我将术语“新扩展”解释为暗示“扩展”拼写。

是否允许符合 C++ 标准的实现

alignof(std::max_align_t) > __STDCPP_DEFAULT_NEW_ALIGNMENT__

如果确实如此,这是否意味着对象创建通过

auto x = ::new(::operator new(sizeof(T))) T;

对于某些非过度对齐类型可能是未定义的行为 T

最佳答案

如果我正确地阅读了标准,新扩展的对齐方式是指 void* operator new( std::size_t count, std::align_val_t al); 的所有变体。 (那些带有 std::align_val_t 的人)。

所以假设__STDCPP_DEFAULT_NEW_ALIGNMENT__ 8 和 std::max_align_t 16、long double的分配则必须调用::operator new(16, std::align_val_t(16)); 。你的编译器必须在你没有注意到的情况下为你做一些事情。

实际上,我相信有 Linux 实现可以保证新的对齐方式为 8。 (moz)jemalloc就是其中之一,为此 github-issue似乎证实了最小对齐是8而不是16。(我没有找到关于它的官方文档)

如果你想使用这样的实现,你必须更新__STDCPP_DEFAULT_NEW_ALIGNMENT__恒定,有关更多详细信息,请参阅我的问题之一:Overloading operator new with smaller default alignment .

为了回答你的最后一个问题,我读了 auto x = ::new(::operator new(sizeof(T))) T;显式调用运算符 new 而不是简单地执行 new T ,在这种情况下,如果 T 需要比默认的新对齐方式更大的对齐方式,我会假设您确实有 UB。请注意,如果两个常量相等,这也成立,因为您可以添加 alignas到类来更改对齐方式。

使用此类类需要格外小心,因为与 std::vector 一起使用时使用自定义分配器.

关于c++ - __STDCPP_DEFAULT_NEW_ALIGNMENT__ 和alignof(std::max_align_t)之间的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59172291/

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