字节顺序&字节对齐
一.字节顺序的产生
在计算机中,数据是以字节为单位存放的,而c语言中只有char才是一个字节,其他如int,float都是大于一个字节,所以就存在将数据按怎样的顺序存放的问题。一般有大端序和小端序两种方式,特殊的还有混合序,也就是两种存放方式同时存在于一个计算机系统中。
上面讲的都是主机字节顺序。
网络字节顺序是指在网络中传输数据的所遵循的字节顺序。TCP/IP采用的是大端序。
二.大端序和小端序
大端序是指数据的低位保存在高地址,数据的高位保存在低地址。对于0X1122,采用大端序进行保存,则如左图所示
小端序是指数据的低位保存在低地址,数据的高位保存在高地址。对于0X1122,采用小端序进行保存,则如右图所示
在linux下可以采用下面的程序段知道它所采用的字节顺序:
#include<iostream> using namespace std; int main(void) { int num=0x12345678; char *p=(char *)# if(*p==0x12&&*(p+1)==0x34) cout<<"linux采用大端序"<<endl; else cout<<"linux采用小端序"<<endl; }
三.数据对齐
1.产生的原因
CPU为了高效的读取数据,要求数据的存放的起始地址是它所占用空间的整数倍。例如,一个double型变量,如果存放的起始地址不是8的整数倍,那么就要两次读取访问内存,而如果起始地址是8的倍数,只需要一次访问内存。
2.自然对齐
i.各成员变量存放的地址相对于结构的起始地址的偏移量为sizeof(类型)或其整数倍。
ii.结构的总大小是其成员中最大类型的sizeof(该类型)整数倍。
所以在定义结构体时最好把结构中的变量按照类型大小从小到大声明,以减少中间的填补空间。
3.强制对齐
强制对齐是程序员通过#pragma pack(n) 设定对齐系数。
如果n大于等于结构体中最大成员所占的空间,那么就跟自然对齐是一样的效果;
如果n小于结构体中最大成员所占的空间,那么每个成员如果不必按最大成员所占空间对齐,只需要按n对齐就可以。最终结构体的大小必然是n的整数倍。