如何在C ++中告诉最大数据对齐要求

时间:2017-02-09 15:05:41

标签: c++ alignment alignof

引用此问题并回答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的倍数?

2 个答案:

答案 0 :(得分:3)

  

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

std::max_align_t

  

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

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

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

  

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

malloc对齐任何标量的边界。在实践中与std::max_align_t完全相同。

“overaligned”类型无法正确对齐。通过overaligned,我的意思是一种比std::max_align_t具有更高对齐要求的类型。

  

然后当malloc返回指向40这样的地址的指针时会发生什么?

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

  

这是无效的,因为指向SomethingElse对象的指针必须是16的倍数?

  

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

要为多个类型分配内存,需要{C} 17中引入的std::aligned_alloc

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

答案 1 :(得分:2)

您可能正在寻找std::max_align_t