\350\207\252\345\256\232\344\271\211\346\225\260\346\215\256\345\257\271\351\275\220

\350\207\252\345\256\232\344\271\211\346\225\260\346\215\256\345\257\271\351\275\220

Content #

默认情况下,编译器会采用自然对齐,来约束数据在内存中的起始位置。但实际 上,我们也可以使用 C11 提供的关键字 _Alignas ,来根据自身需求为数据指 定特殊的对齐要求。并且,头文件 stdalign.h 还为我们提供了与其对应的宏 alignas,可以简化关键字的使用过程。来看下面这段代码:

#include <stdio.h>
#include <stdalign.h>
int main(void) {
#if __alignas_is_defined == 1 && __alignof_is_defined == 1
  alignas(1024) int n = 1;
  printf("The alignment of n is \n", alignof(n));  // "The alignment of n is 1024".
  printf("The address of n is: %p\n", &n);  // "The address of n is: 0x7ffe80658c00".
#endif
  return 0;
}

在代码的第 4 行,我们首先通过验证宏常量 __alignas_is_defined 与 __alignof_is_defined 的值是否为 1,来判断当前编译环境是否支持 alignas 与 alignof 这两个宏。

在代码第 5 行,通过在变量 n 的定义中添加 alignas(1024) 标识符,我们可 以限定,变量 n 的值被存放在内存中时,其起始地址必须为 1024 的倍数。而 在接下来代码的第 6~7 行,我们分别通过使用 alignof 宏函数和直接查看地址 这两种方式,来验证我们对变量 n 指定的对齐方式是否生效。

同 alignas 类似的是,宏函数 alignof 在展开后也会直接对应于 C11 新引入 的运算符关键字 _Alignof,而该关键字可用于查看指定变量需要满足的对齐方 式。并且,通过打印变量 n 的地址,你会发现,这个例子中结尾处的三位 16 进制数字 “c00”,也表示该地址已经在 1024 的边界上对齐。

Viewpoints #

From #

17|标准库:断言、错误处理与对齐