前几天在做项目时,出现了一个套接字通信的一个问题,看似客户端和服务器端使用的一个相同的结构体,但是就是在服务器端不能把客户端发送的数据全部显示的打印出来。查找了好久的错误,才发现原来两端的结构体看似相同,但其两端结构体占用的字节数是不一样的。才导致了服务器端不能正常的显示出全部内容。
大概情况是这样的,client端定义结构体如下:
typedef struct _u64{
long high;
long low;
}U64;
struct _data_pack{
int a;
int b;
union snmp_data{
long name;
U64 buf1;
char buf2[100];
}snmp_data_t;
}data_pack_t;
client
这端发送
sizeof(data_pack_t)
的字节到服务端。
服务端定义如下:
typedef unsigned long long U64;
struct _data_pack{
int a;
int b;
union snmp_data{
long name;
U64 buf1;
char buf2[100];
}snmp_data_t;
}data_pack_t;
struct data5{
char c1;
char c2[2];
};
服务端也接受sizeof(data_pack_t)这么多的字节数。
问题出现了,服务端这边不能不能把共用体中的数据显示的打印出来,查找原因,最后才发现原来两边的结构体大小占用的字节数是不一样的。
client端:sizeof(data_pack_t)= 108
service端:sizeof(data_pack_t)= 112
为此,本人在网上查找了大量有关字节对齐的资料,总结了自己认为快速计算结构体 共用体字节大小的方法,现说明如下:
对于无论是 简单类型的变量 还是结构类型的变量 ,联合类型的变量,在内存中的存储都要按照字节对齐的方式存储。这样存储的主要的目的是能让cpu快速的访问数据。
说到字节对齐,这里有几个重要的概念需要深刻理解 ,记忆:
一 :什么是字节对齐
就是变量存储的地址是变量的有效字节对齐值的整数倍,即:
address%最终有效字节对齐值 = 0;
二:关于几种字节对齐值的说明1 变量的自身字节对齐值