文章目录

  • ​​1 起因​​
  • ​​2 说明​​
  • ​​3 使用​​

1 起因

使用到这个的原因是因为要使用TCP传输结构作为通信协议,但是结构提中的变量可能不是同一个数据类型的,因此会存在变量对齐的问题,使用sizeof(结构体)计算结构体所占字节数,就会存在不是实际的字节长度的问题。

还会存在的另一个问题是读取周期的问题。(空间换时间)

比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该int数据。显然在读取效率上下降很多。这也是空间和时间的博弈。

2 说明

使用​​#pragma pack(n)​​来设定变量以n字节对齐方式,对齐存在两种形式:

  • 1, n大于该变量所占字节数,偏移量使用默认的对齐方式
  • 2,n小于该变量所占字节数,偏移量为n的倍数

3 使用

对齐的字节数为n

#pragma pack (n)
//等价于上面的
//#pragma pack(push,n)
//作用:指定按n字节对齐
struct A{
char b;
int a;
short c;
};
//#pragma pack(pop)
//等价于下面
//作用:取消指定对齐,恢复缺省对齐
#pragma pack()

如果上面的是按一个字节对齐,那么​​sizeof(struct A)​​​的值为7,如果不实用制定对齐,那么​​sizeof(struct A)​​的值为12【按照最长的自身对齐值int来对齐】

实验测试:

#pragma pack用法简介_字节对齐

对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,long类型,其自身对齐值为4,double,long long类型,其自身对齐值为8,单位字节。