c - 如何检查对齐是否在 C 中有效?

标签 c memory-alignment c11

我正在编写的代码需要完全符合标准。该标准不 promise 任何比 max_align_t 更强的对齐选项。我想尝试与缓存行对齐,但我知道如果实现不支持这种强度的对齐,那将是未定义的行为。

有什么办法解决这个问题吗?有什么方法可以在预处理时检查哪些扩展对齐可用?或者,如果对齐不可用,是否有任何方法可以请求对齐,只是没有得到它,而不是有未定义的行为?

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

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

6.2.8

  1. Alignments are represented as values of the type size_t. Valid alignments include only those values returned by an _Alignof expression for fundamental types, plus an additional implementation-defined set of values, which may be empty. Every valid alignment value shall be a nonnegative integral power of two.

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

6.7.5 Alignment specifier

  1. The constant expression shall be an integer constant expression. It shall evaluate to a valid fundamental alignment, or to a valid extended alignment supported by the implementation in the context in which it appears, or to zero.

最佳答案

您的编译器自己选择的对齐方式不应该比 max_align_t 更宽,但仅此而已。要求更广泛的结盟是没有障碍的。

因此,要确保 struct 的特定字段按照您的意愿位于边界上,您只需使用 _Alignas。只要您要求的值是 2 的幂,并且您的编译器允许特定的对齐方式,所有这些都是明确定义的。如果不是,您的编译器必须提示。

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

关于c - 如何检查对齐是否在 C 中有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36229086/

相关文章:

c - malloc、memset 和 free 的正确用法

c - C90 和 C99 中复合类型对象的对齐

c - 在 void * 之上实现一个结构类型

c - ASCII 字符转整数

c - 遍历 C 中的位

c - 为什么我没有得到 “m” 的余数?

c++ - 如何从二进制文件填充结构,同时避免内存对齐填充引起的问题?

c - union 内部结构的填充如何工作?

c - POSIX 线程 : the best interruption method

c - C11 表达式中的赋值运算符排序