C11的对齐特性比用位填充字节更自然。在这种上下文中,对齐指的是如何安排对象在内存中的位置。例如,为了效率最大化,系统可能把一个double类型的值储存在4字节内存地址上,但却允许吧char储存在任意地址。 _Alignof运算符给出一个类型的对齐要求,在关键字后面的圆括号中写上类型名即可:
size_t d_align = _Alignof(float);
假设d_align 的值是4,一是float类型对象的对齐要求是4.也就是说,4是储存该类型值相邻地址的字节数。一般,对齐值都应该是2的非负整数次幂。较大的对齐值被称为stricter或stronger,较小的对齐值被称为weaker。 可以使用_Alignas说明符制定一个变量或类型的对齐值。但是,不应该要求该值小于基本对齐值。例如:float的对其要求是4,不要请求其对齐值是1或者2。
#include <stdio.h>
int main()
{
double dx;
char ca;
char cx;
double dz;
double cb;
char _Alignas(double) cz;
printf("char 对齐: [%zd]\n", _Alignof(char));
printf("double 对齐: [%zd]\n", _Alignof(double));
printf("&dx: [%p]\n", &dx);
printf("&ca: [%p]\n", &ca);
printf("&cx: [%p]\n", &cx);
printf("&dz: [%p]\n", &dz);
printf("&cb: [%p]\n", &cb);
printf("&cz: [%p]\n", &cz);
return 0;
}
|