2

参考this question and answer Memory alignment : how to use alignof / alignas?“对齐是对可以存储值的第一个字节的内存位置的限制。” C++ 中是否有一种可移植的方法来找出指令不出错所需的最高对齐粒度(例如在 ARM 中)?alignof(intmax_t)因为它是最大的整数原始类型就足够了吗?

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

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

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

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

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

4

2 回答 2

3

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

std::max_align_t哪个

是一种 POD 类型,其对齐要求至少与每个标量类型的对齐要求一样严格(一样大)。

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

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


此外,malloc 中的某些内容如何将数据与结构的边界对齐?

malloc对齐到足以满足任何标量的某个边界。在实践中完全一样std::max_align_t

对于“过度对齐”的类型,它不会正确对齐。过度对齐是指一种比 . 具有更高对齐要求的类型std::max_align_t

那么当 malloc 返回一个指向像 40 这样的地址的指针时会发生什么?

取消引用此类SomethingElse*将具有未定义的行为。

由于指向SomethingElse对象的指针必须是16的倍数,这是否无效?

是的。


甚至如何解决这个问题?没有办法告诉 malloc 你想要的对齐方式吗?

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

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

于 2017-02-09T15:35:36.667 回答
2

您可能正在寻找std::max_align_t

于 2017-02-09T15:25:33.237 回答