结构体地址对齐问题,#pragma pack(n),gcc与VC的不同

结构体地址对齐问题

我用的编译器是gcc的64位。
情况一:不含有#pragma pack()

地址对齐参考的字节数,是以结构体元素中最大字节数为标准,若结构体S2中含有结构体S1,结合两个结构体中元素最大的字节数为标准(ps:若出现数组,如:char array[3],拆分成:char array[0]、char array[1]、char array[2].进行对齐。)。
例子
①含有数组:
在这里插入图片描述

②含有结构体:
在这里插入图片描述

情况二:含有#pragma pack()

有种方式可以强制更改结构体对齐方式#pragma pack(n)。但是每个特定平台的编译器都有一个默认的对齐系数,gcc中是4,VC中是8。经测试gcc中n的值只能是1,2和4。
比较n和结构体中最长数据类型所占的字节大小,取两者中小的一个作为对齐标准。若需取消强制对齐方式,则可用命令#pragma pack(),
例:
①#pragma pack(1):以1字节对齐

在这里插入图片描述

②#pragma pack(8):以4字节对齐

在这里插入图片描述

③#pragma pack(4):double为8,还是以4对齐
在这里插入图片描述
总结:可能文档写得不是很清楚,欢迎大家指点。(ps:对于大端序小端序对于结构体地址对齐得影响暂时没有考虑,因为大部分系统都是小端,而网卡抓取的和网路上传输的数据一般都大端。所以暂时没有考虑)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值