上下文是:人们希望得到一个相当好的对齐记忆,例如:允许编译器使用AVX,AVX2。同时,人们试图尽可能地保持代码的可移植性。使用aligned_alloc
分配声音很好,但C11
将此列为未定义的行为:
“aligned_alloc函数请求的对齐无效或实现不支持,或者请求的大小不是对齐的整数倍”
因此,使用例如aligned_alloc(32, 128)
经常可以获得很好的结果,但是前几天,它可能是其他编译器中的UB。
对于这种情况,不太严格的对齐就足够了,导致代码更慢但是更正确。因此,在这种情况下,一些理想的方法将要求最严格的对齐,最多可达128。有没有办法实现这样的事情?
- 问题主要是关于使用aligned_alloc
,而不是创建一个自己的分配器。
== EDIT ==
评论已经回答,它是_Alignof (max_align_t)
答案 0 :(得分:1)
或者你可以随时对齐。如果你害怕UB,你可以编写你的对齐分配器,唯一真正的问题是你需要释放未对齐的指针:
auto align 16;
auto aqbuf = malloc(alignedSize);
auto aligned = (unsigned char*)(((intptr_t)(aqbuf) + (align-1)) & ~(align-1));//aqbuf != aligned sometimes...
free(aqbuf);//forget about aligned