#pragma pack(n) 和#pragma pack()

文章介绍了C编译器如何对结构体进行内存对齐优化,导致stru_test1和stru_test2占用不同字节数。通过使用#pragmapack(1)可以强制设置1字节对齐,节省内存但可能影响效率。在默认对齐和1字节对齐的情况下,stru_test1和stru_test2的字节大小分别为8和12,以及7字节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值