设为首页 加入收藏

TOP

Linux64位程序移植(二)
2015-11-10 13:45:19 来源: 作者: 【 】 浏览:7
Tags:Linux64 程序 移植
iParam = 0;


Func1(&iParam,100);


如果是一些已经定义好的结构体成员,则可通过临时变量来修改


Func(&stPlayer.shParam,100)


修改为


int iTmpParam = stPlayer.shParam;


Func(&iTmpParam,100);


stPlayer.shParam = iTmpParam;


比如下面这段代码,在32位系统上运行没有问题,但64位下运行异常:


if((leftTime + xxz::framework::GetCurrentTimeva l(NULL)) > 0 && (leftTime >= 0))


{


? ? ? ? n->expireTime = leftTime + xxz::framework::GetCurrentTimeva l(NULL);


}


else


{


? ? ? ? n->expireTime = 0x7FFFFFFF;


}


这里在64位下,如果lefttime等于0x7FFFFFFF,则lefttime + xxz::framework::GetCurrentTimeva l(NULL)的结果为long(因为xxz::framework::GetCurrentTimeva l(NULL)返回time_t,为long类型),因此不会溢出,这时相加的结果赋给一个整形(n->expireTime),则这个整形溢出,称为负值,从而发生错误。


改为:


if ((int64)leftTime + (int64)xxz::framework::GetCurrentTimeva l(NULL) >= (int64)0x7FFFFFFF)


{


? ? ? ? dstTime = 0x7FFFFFFF;


}


else


{


? ? ? ? dstTime = leftTime + xxz::framework::GetCurrentTimeva l(NULL);


}


1 修改代码,主要注意以下事项


去除所有的long,替换为固定大小的类型,如int32_t, int64_t等。


时间相关类型的全部用使用time_t来进行处理。


pointer之间的加减法使用intptr_t来存储结果,不要在pointer和int之间相互转换。


如果必须用size_t,比如STL,则传值赋值都用size_t,不要在int和size_t之间相互转换,以免结果被截断。


格式化字符串使用如下的兼容性定义来处理,避免告警:


#if __WORDSIZE == 64


#define FMT_SIZET "%u"


#else


#define FMT_SIZET "%lu"


2 替换外部库


这一步比较难,因为有些外部库没有64位版本,这就有可能需要推动外部库的64位化工作,或者将这部分功能挪到其它进程。


3 运营环境


修改脚本支持64位环境


一些数据需要用64位程序重新生成,供程序使用


主流的硬件供应商最近都在扩充自己的64位产品,这是因为64位平台可以提供更好的性能和可伸缩性。32位系统的限制,特别是4GB的虚拟内存上限,已经极大地刺激很多公司开始考虑迁移到64位平台上。了解如何将应用程序移植到64位体系结构上可以帮助我们编写可移植性更好且效率更高的代码。


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇编写更好 Bash 脚本的 8 个建 下一篇关键字volatile在C语言下的理解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: