结构体地址对齐问题
我用的编译器是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:对于大端序小端序对于结构体地址对齐得影响暂时没有考虑,因为大部分系统都是小端,而网卡抓取的和网路上传输的数据一般都大端。所以暂时没有考虑)