C 语言中结构体字节对其的两种方式

本文介绍了C语言中实现字节对齐的两种方法:通过预处理命令#pragmapack(n)设置特定的对齐方式及使用__attribute__((packed))取消默认优化,确保结构体成员按实际大小对齐。

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

C语言中字节对其有两种方式:

1、通过预处理命令

#pragma pack(n),指定按照n字节对齐;
#pragma pack(),取消自定义的对齐值;

例如:

#pragma pack(2)
struct A 

  char c;   //第一个成员,自身长1,#pragma pack(2),取较小值,按照1字节对齐,放在[0]偏移的位置;
  int  i;   //第二个成员,自身长4,#pragma pack(2),取较小值,按照2字节对齐,放在[2,5]偏移的位置;
}; 
struct B 

  char c1;  //第一个成员,自身长1,#pragma pack(2),取较小值,按照1字节对齐,放在[0]偏移的位置;
  A    s;   //第二个成员,自身长6,#pragma pack(2),取较小值,按照2字节对齐,放在[2,7]偏移的位置;
  char c2;  //第三个成员,自身长1,#pragma pack(2),取较小值,按照1字节对齐,存放在[8]偏移的位置;
}; 
#pragma pack()

2、__attribute__((packed)):取消结构体在编译过程中的优化对齐,按照实际占用字节数进行对齐,等价于指令#pragma pack(1),即,按照1字节对齐;

备注:对于内存对齐,CPU的优化规则大致原则是这样的:对于n字节的元素(n=2,4,8,...),它的首地址能被n整除时,才能获得最好的性能;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值