科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道32位程序移植到64位平台前的准备工作

32位程序移植到64位平台前的准备工作

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

我们最近完成的一个项目是移植一个大型的32位应用程序,它可在64位环境中支持11个操作系统平台..

作者:启东编译 来源:天极开发 2007年10月13日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共3页)

隐藏的问题

  当然,也有一些问题不会在一开始就很容易地被发现,例如,在64位程序中,long与指针尺寸更大了,随之也会带来包含它们的结构大小上的增长。结构元素的排列方式决定了结构将占用多大的空间,举例来说,一个包含了int其后跟着一个long的结构,在32位程序中占用8字节,但64位程序在结构的第一个元素上加入了4个字节的填充数据,以使第二个元素在边界上排列得更自然,见图1:


图1:32位与64位结构中数据的排列方式

  为最小化填充数据所带来的影响,可把结构中的数据元素按从大到小重新排列。但是,如果数据元素是通过字节流访问的,还必须调整代码中的逻辑部分,以适应结构中的新的数据排列方式。

  在那些重新排列结构数据不起作用,或数据元素是通过字节流访问的情况中,就要小心计算填充数据,我们对此的解决方案是,实现一个帮助函数,在把数据写到字节流之前,从结构中消去多余的填充数据;而由此带来的另一个好处是,在读取数据时就不需要作任何修改了,参见例2:

  例2:

typdef struct demo{
 int i;
 long j;
} DEMO;

DEMO test;
/*pout_raw输出原始数据到一个文件中*/
/*输出结构的每一个元素并避免了填充数据*/
pout_raw ((int) file_unit, (char *) test.i, sizeof (test.i));
pout_raw ((int) file_unit, (char *) test.j, sizeof (test.j));

/*下行包含了填充数据*/
pout_raw ((int) file_unit, (char *) test,sizeof(test));

  数组问题

  64位上的long型数组或结构中的数组,不只是比它们32位的对等体包含更大的数值,而且可包含更多的元素。回头看一下前面用来定义数组边界和分配数组大小的4字节变量,它们可被转换成long。如果为了让64程序获得更好的性能,需决定现存的long数组是否应转换成int类型,请参考http://developers.sun.com/prodtech/cc/articles/ILP32toLP64Issues.html。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章