如何判断 C++ 中的最大数据对齐要求

How to tell the maximum data alignment requirement in C++

参考这个问题和答案 Memory alignment : how to use alignof / alignas? "Alignment is a restriction on which memory positions a value's first byte can be stored." C++ 中是否有一种可移植的方法来找出指令不出错所需的最高对齐粒度(例如在 ARM 中)? alignof(intmax_t) 是否足够,因为它是最大的整数原始类型?

此外,malloc 中的某些内容如何将数据与结构的边界对齐?例如,如果我有这样的结构

alignas(16) struct SomethingElse { ... };

SomethingElse 结构需要与 16 字节的倍数的边界对齐。现在,如果我像这样从 malloc 请求结构的内存

SomethingElse* ptr = malloc(sizeof(SomethingElse));

那么当 malloc returns 一个指向像 40 这样的地址的指针时会发生什么?这是否无效,因为指向 SomethingElse 对象的指针必须是 16 的倍数?

您可能正在寻找 std::max_align_t

How to tell the maximum data alignment requirement in C++

std::max_align_t

is a POD type whose alignment requirement is at least as strict (as large) as that of every scalar type.

矢量指令可以使用比任何标量要求更高对齐的数组操作数。我不知道是否有一种可移植的方法来找出上限。

要查找特定类型的对齐要求,您可以使用 alignof


Further, how does something in malloc align data to a struct's boundaries?

malloc 对齐到足以满足任何标量的某个边界。实际上与 std::max_align_t.

完全相同

"overaligned" 类型无法正确对齐。过度对齐是指对齐要求高于 std::max_align_t.

的类型

Then what happens when malloc returns a pointer that points to an address like 40?

取消引用这样的 SomethingElse* 会有未定义的行为。

Is that invalid since the pointer to SomethingElse objects must be a multiple of 16?

是的。


how even would one go about fixing that? There is no way to tell malloc the alignment that you want right?

要为过度对齐的类型分配内存,您需要std::aligned_alloc,这将在C++17中引入。

在那之前,您可以使用特定于平台的函数,例如 posix_memalign 或者您可以使用 std::malloc 过度分配(分配对齐 - 1 个额外字节),然后使用 std::align找到正确的边界。但是你必须分别跟踪缓冲区的开始和内存块的开始。