文章目录
- 1 起因
- 2 说明
- 3 使用
1 起因
使用到这个的原因是因为要使用TCP传输结构作为通信协议,但是结构提中的变量可能不是同一个数据类型的,因此会存在变量对齐的问题,使用sizeof(结构体)计算结构体所占字节数,就会存在不是实际的字节长度的问题。
还会存在的另一个问题是读取周期的问题。(空间换时间)
比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该int数据。显然在读取效率上下降很多。这也是空间和时间的博弈。
2 说明
使用#pragma pack(n)
来设定变量以n字节对齐方式,对齐存在两种形式:
- 1, n大于该变量所占字节数,偏移量使用默认的对齐方式
- 2,n小于该变量所占字节数,偏移量为n的倍数
3 使用
对齐的字节数为n
//等价于上面的
//#pragma pack(push,n)
//作用:指定按n字节对齐
struct A{
char b;
int a;
short c;
};
//#pragma pack(pop)
//等价于下面
//作用:取消指定对齐,恢复缺省对齐
如果上面的是按一个字节对齐,那么sizeof(struct A)
的值为7,如果不实用制定对齐,那么sizeof(struct A)
的值为12【按照最长的自身对齐值int来对齐】
实验测试:
对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,long类型,其自身对齐值为4,double,long long类型,其自身对齐值为8,单位字节。