如何检查C中的对齐是否有效?

时间:2016-03-25 22:30:02

标签: c memory-alignment c11

我写的代码需要完全符合标准。该标准不承诺任何对齐选项强于max_align_t。我想尝试与高速缓存行对齐,但是如果实现不支持该强度的对齐,我理解这是未定义的行为。

这有什么办法吗?有哪些方法可以检查预处理扩展对齐的可用性?或者,如果对齐不可用,有没有办法要求对齐,而不是得到它,而不是有未定义的行为?

aligned_alloc适用于已分配的内存。但是,我也对静态存储的内存感兴趣。

编辑: 为了说明我的问题,以下是我遇到问题的C11标准声明:

  

6.2.8

     
      
  1. 对齐表示为size_t类型的值。有效对齐仅包括基本类型的_Alignof表达式返回的值,以及可能为空的其他实现定义值集。每个有效的对齐值应为2的非负整数幂。
  2.   

因此任何给定的2次幂不一定是有效对齐,并且我不能指望64小于或等于max_align_t,因此64可能不是有效对齐。如果它不是有效的对齐方式,那么这是我未定义的行为问题:

  

6.7.5对齐说明符

     
      
  1. 常量表达式应为整数常量表达式。它应评估为有效的基本对齐,或者在其出现的上下文中由实现支持的有效扩展对齐,或者为零。
  2.   

2 个答案:

答案 0 :(得分:2)

编译器自己选择的对齐不应该比max_align_t宽,但这就是它的全部内容。要求更广泛的一致性没有阻截。

因此,为了确保struct的特定字段位于边界上,您只需使用_Alignas即可。只要您要求的值是2的幂,并且编译器允许特定对齐,所有都是明确定义的。如果不是,编译器必须抱怨。

这正是C11中添加_Alignas的原因之一。

答案 1 :(得分:0)

我认为,您需要查看功能 valloc() memalign()。 另外,非常有用的电话:

int pagesize = sysconf(_SC_PAGESIZE);

如果您需要将缓冲区与pagesize对齐,可以调用:

char *buf = ...; // Buffer to unaligned memory
buf -= (uinsigned)buf & (pagesize - 1); // align to low border
buf += pagesize; // align to high border