我正在使用 gcc 11.4 和 -m32 -std=c++20 编译代码
alignof(max_align_t) == 16
__STDCPP_DEFAULT_NEW_ALIGNMENT__ == 16
我应该从新声明中得到什么保证的一致性? 根据https://en.cppreference.com/w/cpp/types/max_align_t:
std::malloc 等分配函数返回的指针对于任何对象都进行适当对齐,这意味着它们至少与 std::max_align_t 一样严格对齐。
std::max_align_t 通常与最大标量类型同义,在大多数平台上为 long double,其对齐要求为 8 或 16。
所以我想说它应该是 16 个字节,但是我在 gdb/debug 日志中看到我的应用程序中 new 语句返回的地址仅与 8 个字节对齐。
根据: https://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html 我应该期望 8 字节对齐。真相是什么?
如果 new/malloc 返回 8 字节对齐地址并且 STDCPP_DEFAULT_NEW_ALIGNMENT == 16 那么如果你想为 16 字节对齐实体分配内存,你可能会陷入分配机制中的“漏洞”,因为 8 字节对齐是不够的但您的 16 字节对齐实体无法触发 c++17 中的运算符 new(sizeof(T), std::align_val_t(alignof(T)))) 。
这个问题与这里描述的问题类似吗? https://gcc.gnu.org/bugzilla/show_bug.cgi?id=15795
使用调试日志和 gdb 检查地址。 谷歌搜索类似的问题。
新表达式会根据其类型的需要适当地对齐它创建的对象。
一般没有任何更严格的对齐要求。
std::byte
、unsigned char
和 char
array-new 表达式存在例外,它们将对齐数组对象,以便其地址对于数组大小不超过最大基本对齐的任何对象进行适当对齐,即 alignof(max_align_t)
。