sdk在升级到64位编译后在解析本地一个资源文件时出现了bug,对每个字段写入和解析时的偏移位置打出日志,发现其中一个结构体成员变量中少了4字节。
这个结构体大致是这样的:
struct node{
int a;
int b;
int c;
vector<string> list;
};
令int offset = (char*)&(A.list) - (char*)&(A.a);
在32位编译下offset=12,而在64位编译下offset=16,而原来的代码中把这个offset写死了=12导致了bug。
解决方案有两种:
1.用(char*)&(A.list) - (char*)&(A.a)来替代12,不过这样在升级时会导致升级后的程序解析原来的32位的文件出错
2.将node这个结构体按1字节对齐:
#pragma pack (push, 1)
struct node{
int a;
int b;
int c;
vector<string> list;
};
#pragma pack(pop)
注意必须在node定义的地方加伪指令,在包含node的其他结构体上加伪指令是没有作用的。