1、结构体对齐访问实例
#include <stdio.h>
struct s {
char b;
int c;
};
int main(void)
{
printf("sizeof(struct s) = %d.\n",sizeof(struct s)); //8
struct s s1;
s1.b = 't';
s1.c = 12;
char *p1 = (char*)(&s1);
printf("*p1 = %c.\n",*p1); //t
int *p2 = (char*)((int)&s1 + 1);
printf("*p2 = %d.\n",*p2); // 201852036
int *p3 = (char*)((int)&s1 + 4);
printf("*p3 = %d.\n",*p3); // 12
return 0;
}
2、结构体为何要对齐访问
访问结构体元素时需要对齐访问,主要是为了配合硬件,也就是说硬件本身有物理上的限制,因此对齐排布和访问可以提高访问效率。
3、结构体对齐的规则和运算
(1)当编译器将结构体设置为4字节对齐时,结构体整体必须从4字节对齐处存放,结构体对齐后的大小必须为4的倍数。如果编译器设置为8字节对齐,则这里的4就是8。
(2)结构体中每个元素本身也必须对齐存放。
(3)编译器在考虑以上两点情况下,实现以最少内存来开辟结构体空间。
4、手动对齐
如果编译器自动实现结构体对齐,我们称之为自动对齐,与之相反,使用#pragma对齐的就是手动对齐。
我们需要以#pragma pack(n)开头,以#pragma pack()结尾,定义一个区间,这个区间内的对齐参数就是n。
#include <stdio.h>
#pragma pack(4)
struct mystruct1 {
int a;
char b;
short c;
};
struct mystruct2 {
char a;
int b;
short c;
};
typedef struct myStruct5 {
int a;
struct mystruct1 s1;
double b;
int c;
}MyS5;
struct stu {
char sex;
int length;
char name[10];
};
#pragma pack()
int main(void)
{
printf("sizeof(struct mystruct1) = %d.\n",sizeof(struct mystruct1));
printf("sizeof(struct mystruct2) = %d.\n",sizeof(struct mystruct2));
printf("sizeof(struct mystruct5) = %d.\n",sizeof(MyS5));
printf("sizeof(struct stu) = %d.\n",sizeof(struct stu));
/*
* sizeof(struct mystruct1) = 8.
* sizeof(struct mystruct2) = 12.
* sizeof(struct mystruct5) = 24.
* sizeof(struct stu) = 20.
*/
return 0;
}