迁移到64位后的字节对齐问题

sdk在升级到64位编译后在解析本地一个资源文件时出现了bug,对每个字段写入和解析时的偏移位置打出日志,发现其中一个结构体成员变量中少了4字节。

这个结构体大致是这样的:

struct node{
    int a;
    int b;
    int c;
    vector<string> list;
};


创建一个结构体对象 node A;
令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的其他结构体上加伪指令是没有作用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值