#pragma pack(n) 和#pragma pack() 强制C编译器以n字节进行对其,
比如我们在32位的操作系统中,结合以下两个例子进行分析
typedef define
{
int a;
short b;
char c;
}stru_test1;
printf("stru_test1所占字节数为%d\n",sizeof(stru_test1));
typedef define
{
short b;
int a;
char c;
}stru_test2;
printf("stru_test2所占字节数为%d\n",sizeof(stru_test2));
那么上面代码在进行编译运行之后,stru_test1和stru_test2所占字节的大小为多少呢?
运行后
stru_test1所占字节数为:8
stru_test1所占字节数为:12
是不是可能感觉不知道为什么是8和12,下面来进行解释说明:
C编译器在编译时为了提高代码的运行效率,会对结构体进行优化,成员变量按照4字节进行对齐,对于int、short、long等类型,在结构体空间中以偶数地址为起始开始存放,且一次性连续存放完。
stru_test1所占空间大小以及成员变量在存储空间中的分布

stru_test2所占空间大小以及成员变量在存储空间中的分布

而#pragma pack(1)让编译器将结构体数据强制连续排列,设置内存对齐为:1字节对齐。
意思就是 以下代码编译出来的是以1个字节的方式对齐的。这样能节约内存资源,但是会在效率上有所影响
#pragma pack(1)
typedef define
{
int a;
short b;
char c;
}stru_test1;
typedef define
{
short b;
int a;
char c;
}stru_test2;
#pragma pack()
printf("stru_test1所占字节数为%d\n",sizeof(stru_test1));
printf("stru_test2所占字节数为%d\n",sizeof(stru_test2));
此时编译运行之后stru_test1所占字节大小和stru_test2所占字节大小一样,都是7个字节。
注意:#pragma pack(n)的使用格式为
#pragma pack(n)
/* code */
#pragma pack()
原文链接:https://blog.csdn.net/Roger_717/article/details/125180831