1,结构体元素的对齐规则
基本对齐方式
为了提高访问效率,结构体里变量的存储遵循一定的规则
例如:
#include <stdio.h>
struct data
{
char a; // 填充3个字节
int b;
short c;
}s; // 结构体变量名s
int main(void)
{
printf("sizeof(s) = %d.\n", sizeof(s));
}
输出的结果是12,因为char填充了3个字节,short填充了2个字节
但如果加上double型变量,结果却不是12+8=20:
#include <stdio.h>
struct data
{
char a;
int b;
short c;
double d;
}s;
int main(void)
{
printf("sizeof(s) = %d.\n", sizeof(s));
}
而是24,原因在于:1,在64位系统下结构体元素默认是8字节对齐,而在32位系统默认4字节对齐。
2,默认的对齐方式和结构体本身元素对齐方式相比,两者取其小。
所以,第一个例子,结构体里元素最大是int,4字节,比默认的8字节小,所以4字节对齐;
第二个例子,结构体里最大元素是double,8字节,所以8字节对齐。
自定义对齐方式
#pragma pack(n) //设置结构体对齐方式,限制一个区间 n = 2的次方(0、1、2…)
如上例一,将其定义为2字节对齐:
#include <stdio.h>
#pragma pack(2)
struct data
{
char a;
int b;
short c;
}s;
int main(void)
{
printf("sizeof(s) = %d.\n", sizeof(s));
}
则打印结果为8,因为2比默认的8位小,所以就按2字节对齐