- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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
?
最佳答案
std::max_align_t
:最大标量类型的对齐方式__STDCPP_DEFAULT_NEW_ALIGNMENT__
:分配内存的对齐方式如果我正确地阅读了标准,新扩展的对齐方式是指 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/
我得到了错误 "/usr/include/c++/5/cstddef:51:11: error: ‘::max_align_t’ has not been declared using ::max_a
我正在尝试在 MinGW64 中打印 std::max_align_t 的值。下面是我的代码: #include #include int main() { printf("max all
在this thread我被建议使用 max_align_t 来为任何类型正确对齐地址,我最终创建了动态数组的这个实现: #include #include #include #include
max_align_t在libstdc++中定义如下: typedef struct { long long __max_align_ll __attribute__((__aligned__(_
在 x86-64/Linux 上使用 GCC 和 Clang alignof(std::max_align_t)和__STDCPP_DEFAULT_NEW_ALIGNMENT__都等于16 . 在 x
我想编译这段代码: #include #include #include int main ( int argc , char ** argv ) { printf ("%zu\n",
In this video ,在大约 6.39 处,演示者似乎在说 new 总是返回与 std::max_align_t 对齐的内存,这是有道理的,因为 operator new对分配的变量类型一无所
在 Visual Studio 中,编译 64 位时: sizeof(std::max_align_t) 为 8 __STDCPP_DEFAULT_NEW_ALIGNMENT__ 为 16 因此,尽管
我是一名优秀的程序员,十分优秀!