移植32位C ++代码到64位 - 是值得吗? 为什么?(Porting 32 bit C++

2019-07-19 17:13发布

我知道的是x64架构的一些明显的收益(高寻址RAM地址等)...但是:

  • 如果我的程序有没有真正的需要在本机64位模式下运行。 我应该端口也无妨?
  • 是否有结束的32位支持任何可预见的期限?
  • 将我的应用程序运行得更快/更好/更原生的x64代码的安全?

Answer 1:

X86-64是一个有点特殊情况 - 对于许多架构(例如SPARC),编制了64位模式下的应用程序不给它,除非它可以用盈利比4GB的内存任何好处。 它所做的就是增加了二进制文件的大小,这实际上可以使代码更慢 ,如果它在缓存行为的影响。

然而,X86-64为您提供的不仅仅是一个64位地址空间和64个整数寄存器-它也加倍的通用寄存器的数量,这对像86寄存器缺陷的架构会导致显著的性能提升,只有重新编译。

它也可以让编译器假设很多扩展,如SSE和SSE2,都存在,这也可以显著提高代码优化。

另一个好处是,增加了x86-64的PC-相对寻址,这可以简化显著位置无关的代码。

但是,如果应用程序的性能并不敏感,那么这一切都不是非常重要的两种。



Answer 2:

我还没有看到提到的一个可能的好处是,它可能会发现潜在的错误。 一旦你把它移植到64位,一些变化制成。 一些数据类型的大小变化,调用约定的变化,异常处理机制(至少在Windows上)的变化。

所有这一切都可能导致否则隐藏的错误堆焊,这意味着你可以解决这些问题。

假设你的代码是正确的,没有错误的,移植到64位在理论上应该为轻弹编译器开关一样简单。 如果失败,那是因为你靠的事情不是由语言保证的,所以,他们是错误的潜在来源。



Answer 3:

下面是64位的为你做:

  • 64位允许您使用更多的内存比32位应用程序。
  • 64位使所有指针64位,这使你的代码占据空间大。
  • 64位给你更多的整数和浮点寄存器,这将导致更少的溢出寄存器内存,应该有所加快您的应用程序。
  • 64位可以使64位ALU操作变得更快(如果您正在使用64位数据类型时才有所帮助)。
  • 你没有得到任何额外的安全性(另一个答复中提到的安全,我不知道像任何好处)。
  • 你只限于在64位操作系统上运行。

我已经移植了一些C ++的应用程序和可见大约64位码的10%的加速(相同的系统,相同的编译器中,唯一的变化是在32位和64位的编译器模式),但大多数这些应用都是做64位数学相当数量。 因人而异。

我不会担心32位的支持很快消失的时间。

(编辑,包括自评说明 - !谢谢)



Answer 4:

虽然它的真正的32位将围绕以某种形式或其他,只有64位SKU的Windows Server 2008 R2的船舶一段时间。 作为一个为更多的软件迁移到64位早安装选项,Windows 8的,我也不会惊讶地看到WOW64。 WOW64是安装,内存和性能开销。 在32位Windows的3.5GB内存的限制随着RAM密度将鼓励这种迁移一起。 我宁愿有比CPU更多的内存...

拥抱64位! 花时间,让您的32位代码兼容64位,它是没有道理和简单。 对于正常的应用程序的更改是更准确地描述为码校正。 对于司机的选择是:调整或失去用户。 到时候,你就可以准备一个重新编译任何平台上部署。

IMO当前缓存相关的问题是没有实际意义; 在这方面的进一步的64位优化硅的改进将很快到来。



Answer 5:

  1. 如果你的程序有没有必要在64位运行,为什么你会? 如果你不是内存绑定,并且你没有庞大的数据集,没有一点。 新马自达Miata没有更大的轮胎,因为它并不需要他们。
  2. 支持32位(即使只通过仿真)当你的软件不再是有用的将延长早已过去。 我们仍然效仿雅达利2600S,对不对?
  3. 不,在所有的情形产生,您的申请将在64位模式慢,只是因为少的它适合于处理器的高速缓存。 这可能会稍微更安全,但好的程序员不需要那个拐杖:)

波多黎各马里亚尼的,为什么微软移植的Visual Studio 64位后真的概括起来的Visual Studio:为什么没有64位版本? (然而)



Answer 6:

这取决于你的代码是否是一个应用程序或可重复使用的库。 对于库,请记住,该库的客户可能有很好的理由在64位模式下运行,所以你必须确保你的场景的作品。 这也适用于应用程序时,他们是通过插件扩展。



Answer 7:

如果你没有任何真正的需要了,而且可能永远不会,64位模式下,你不应该做移植。

如果你没有必要了,但有一天可以拥有它,你应该尝试估计多少努力将(例如,通过打开所有相应的编译器警告,并试图在64位编译)。 预计,有些事情不是小事,所以这将是懂得什么问题你可能会遇到有用的,多久它可能会采取解决这些问题。

请注意,有必要也可以从依赖产生:如果你的程序是一个库(如DLL),可能有必要将它移植到64位模式,只是因为某些主机应用程序被移植。

对于可预见的未来,32位应用程序将会继续得到支持。



Answer 8:

除非有一个商业原因去64位,那么就没有真正“需要”支持64位。

然而,也有一些很好的理由,在某些时候要64位,除了所有其他人已经提到的那些。

  • 这是越来越难买到的是不是64位电脑。 尽管32位的应用程序将在兼容模式下运行几年来,任何新的电脑被出售今天或将来都可能是64位。 如果我有一个闪亮的64位操作系统,我真的不希望在兼容模式下运行“臭老32位应用程序”!

  • 有些东西只是不comptibility模式下正常运行 - 这不是同样的事情对32位硬件的32位操作系统上运行。 我在兼容模式下运行时遇到的几个问题(整个32/64位注册表配置单元,即失败是因为他们希望在等文件夹中的不是程序如注册表访问)。 我总是感到紧张在兼容模式下运行我的代码 - 它只是“不是真实的东西”,它常常表现为。

  • 如果你写干净的代码,那么很可能你只需要重新编译它作为一个64位的EXE,它会正常工作,所以没有真正的理由不试一试。

  • 你建立一个原生64位版本越早,就越容易保持它的工作在64位当你添加新的功能。 这是不是继续在黑暗时代发展的另一个“N”年,然后试图跳出到光一个更好的计划。

  • 当你去你的下一个面试,你就可以说,你有64位expeirence和32-> 64的移植经验。



Answer 9:

你已经知道的64优势(最重要的是增加RAM大小),你不感兴趣的任何,然后不要端口的可执行文件(EXE)。 通常性能端口后下降,主要是由于在86在64位模块的尺寸增加:所有的指针现在需要双长度,这渗滤无处不在,包括代码尺寸(有些跳跃,函数调用虚函数表,虚拟所调用,全局符号等等等等)。 是不是显著下降,但通常可衡量的(3-5%的速度下降,取决于许多因素)。

DLL是值得移植,因为你获得的64位应用程序,能够消耗你的DLL一个新的“观众”。



Answer 10:

一些操作系统或配置无法运行32位程序。 一个最小的Linux而不32位的libc安装例子。 此外IIRC我经常编出从内核的32位支持。

如果这些操作系统或配置您的潜在用户群的一部分,那么是的,你应该将它移植。

如果你需要更快的速度,那么你也应该将它移植(如其他人所说,X86-64有更多的寄存器和加速它很酷的说明)。

或者,当然,如果你想的mmap()或以其他方式映射大文件或大量内存。 然后,64位帮助。



Answer 11:

例如,如果你写32位代码(GNU C / ++)如下编辑:格式码

struct packet {
    unsigned long name_id;
    unsigned short age;
};

用于网络消息,则需要一个64位的系统上,而重新编译做移植因为htonl的,/再用ntohl等通信获得在网络对等体的情况下,仍然使用32位系统(使用相同的代码为已损坏你的); 你知道的sizeof(长)从32到64得在你身边发生变化。

看到在32/64移植更多音符http://code.google.com/p/effocore/downloads/list ,文档名称EffoCoreRef.pdf。



Answer 12:

这是非常不可能的,你会看到任何好处,除非你需要极度安全措施或淫秽数量的RAM是。

基本上,你最有可能本能地知道,如果你的代码是64位移植一个很好的候选人。



Answer 13:

关于最后期限。 我不会担心,像32位将是绕了好一会儿本身和其他一些形式的可预见的未来。



Answer 14:

见我回答这个问题在这里。 我关闭了这个职位说,一个64位的计算机可以存储和检索比32位计算机的更多信息。 对于大多数用户来说,这并不代表了一大堆东西,因为像浏览网页,收发电子邮件,玩接龙的32位寻址范围内的所有工作无忧。 当64位的好处才会真正出色的地方是在你有很多数据的计算机将有流失通过的区域。 数字信号处理技术,超高画质像素摄影和先进的3D游戏是所有领域,他们的数据处理海量会看到在64位环境中一个巨大的推动。

至于运行速度更快的代码/更好,这完全取决于你的代码,并强加于它的要求。



Answer 15:

至于性能问题,这取决于你的程序实际上。 如果你的程序是指针密集,移植到64位可能会导致性能降级,因为对于CPU的缓存与同样大小,每64位指针占用缓存更多的空间,和虚拟到物理映射也占有更多的TLB空间。 否则,如果你的程序是不是指针密集,它的性能将受益于64位。

当然,性能不用于移植的唯一原因,如移植工作等问题,时间安排也应考虑。



Answer 16:

我会建议将它移植到64位只是让你运行的“原生”(另外,我使用OpenBSD系统。在他们的AMD64端口,它们不提供任何32位仿真支持,一切都必须是64位)

此外, stdint.h是你最好的朋友! 通过移植您的应用程序,你应该学会如何编写代码可移植性。 这将使你的代码工作的权利时,我们有128个处理器太(在几十年希望)

我已经移植2米或3的东西到64位,现在开发都(如果你使用stdint.h这是非常容易的),并在我的第一个项目移植到64位导致像2级或3的错误露面,但那是它。 大部分是简单的重新编译,现在作出新的代码的时候,因为我只是自动便携代码,我不担心32位和64位之间的差异。 (使用intptr_t和为size_t并且这样的)



Answer 17:

在DLL中的情况下从64位过程中被称为则DLL需要成为64个比特为好。 然后,它并不重要,如果它是值得的,你根本别无选择。



Answer 18:

有一个问题要记住的是软件库提供。 例如,我公司开发,使用多个OpenGL库的应用程序,以及我们对openSUSE的OS这样做。 在旧版本的操作系统,一个可下载的x86_64体系,这些库的32位版本。 新版本,但是,没有这个。 这使得它更容易只是编译64位模式。



Answer 19:

64位运行速度快了很多,当64位编译器变得成熟,但何时会发生这我不知道



文章来源: Porting 32 bit C++ code to 64 bit - is it worth it? Why?