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