有没有可行的方法来找出C11实现支持的对齐方式?

时间:2015-01-13 23:07:27

标签: c memory-alignment c11

上下文是:人们希望得到一个相当好的对齐记忆,例如:允许编译器使用AVX,AVX2。同时,人们试图尽可能地保持代码的可移植性。使用aligned_alloc分配声音很好,但C11将此列为未定义的行为:

“aligned_alloc函数请求的对齐无效或实现不支持,或者请求的大小不是对齐的整数倍”

因此,使用例如aligned_alloc(32, 128)经常可以获得很好的结果,但是前几天,它可能是其他编译器中的UB。

对于这种情况,不太严格的对齐就足够了,导致代码更慢但是更正确。因此,在这种情况下,一些理想的方法将要求最严格的对齐,最多可达128。有没有办法实现这样的事情?

- 问题主要是关于使用aligned_alloc,而不是创建一个自己的分配器。

== EDIT ==

评论已经回答,它是_Alignof (max_align_t)

chx chux,我忽略了那一个!

1 个答案:

答案 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