续上篇博文:http://www.cnblogs.com/flamefox/p/4241176.html
上次把结构体的编译问题解决了,这次又来了新问题,客户端和服务器访问相同的结构,出现了bug
原始的代码如下(结构1):
struct MsgInfo { union { struct //for exp { OBJID idType; USHORT usLevel; UINT unExp; }; struct //for learn { OBJID idType; USHORT usLevel; UCHAR ucResult; }; struct //for update { OBJID idType; USHORT usLevel; UCHAR ucResult; }; } }
可以看到这3个结构的前2个字段都是一样,于是后续开发的程序员为了省事,做了一下变化,
改成下面这样(结构2):
struct //for learn { OBJID idType; USHORT usLevel; union { UINT unExp; UCHAR ucResult; }; };
可以看到,一个struct就解决问题了,但是问题来了,服务器和客户端的数据不匹配了
检查代码后,我们一致认定是对齐问题造成的问题,由于代码是8字节对齐的,分析如下:
从之前旧的结构改为新的结构后,看似没有什么不同,但是如果考虑对齐的话,就会有很大的问题
结构2的对齐
idType 4
usLevel 2 补全到4
ucResult 1 和
unExp 4 共用一块内存
结构1的对齐
struct //for learn
{
OBJID idType; 4
USHORT usLevel; 2
UCHAR ucResult; 1
};
其只有7字节,补齐到8字节,这意味着
客户端和服务端读取和写入数据的字节的位置完全不一样,之前那位修改结构的同学修改出错了。而客户端由于其他的原因可以“正常”的显示,问题在当时没有暴露。
所以最后还是要修改回原始的方式。。切记不要过早优化啊
时间: 2024-11-06 03:06:42