一.结构体内存对齐
结构体内存大小计算方法:
偏移量:是指某个成员在结构体中相对于结构体首地址的偏移字节数。在计算机中,结构体是一种自定义数据类型,它由多个不同类型的成员组成。每个成员在内存中的存储位置是连续的,而结构体本身在内存中的存储位置也是连续的。因此,计算某个成员的偏移量可以帮助我们更好地理解结构体在内存中的存储方式。
例一:
例二:
例三:
例四:
嵌套的结构体会对齐到自己的最大对齐数,结构体整体大小为所有元素对齐数的最大值的整数倍
二.为什么存在内存对齐
三.节省空间的方法
四.修改默认对齐数
例一:
修改前:
#include<stdio.h>
#include<stddef.h>
typedef struct S1
{
int a;
double b;
}S1;
int main()
{
printf("%zu\n",offsetof(S1,a));
printf("%zu\n", offsetof(S1,b));
printf("%zu",sizeof(S1));
return 0;
}
修改后:
#include<stdio.h>
#include<stddef.h>
#pragma pack(4)
typedef struct S1
{
int a;
double b;
}S1;
#pragma pack()
int main()
{
printf("%zu\n",offsetof(S1,a));
printf("%zu\n", offsetof(S1,b));
printf("%zu",sizeof(S1));
return 0;
}
例二:
修改前:
#include<stdio.h>
#include<stddef.h>
typedef struct S1
{
int a;
char b;
double c;
}S1;
int main()
{
printf("%zu\n",offsetof(S1,a));
printf("%zu\n", offsetof(S1,b));
printf("%zu\n", offsetof(S1,c));
printf("%zu",sizeof(S1));
return 0;
}
修改后:
#include<stdio.h>
#include<stddef.h>
#pragma pack(1)
typedef struct S1
{
int a;
char b;
double c;
}S1;
#pragma pack()
int main()
{
printf("%zu\n",offsetof(S1,a));
printf("%zu\n", offsetof(S1,b));
printf("%zu\n", offsetof(S1,c));
printf("%d",sizeof(S1));
return 0;
}