将32位C++代码移植到64位 - 值得吗?为什么?

NTD*_*DLS 44 c++ 64-bit x86 x86-64 cpu-architecture

我知道x64架构的一些显而易见的好处(更高的可寻址RAM地址等)......但是:

  • 如果我的程序没有真正需要在本机64位模式下运行怎么办?我应该移植它吗?
  • 是否有任何可预见的截止日期为32位支持?
  • 我的应用程序会像原生x64代码一样运行得更快/更好/更安全吗?

caf*_*caf 65

x86-64有点特殊情况 - 对于许多架构(例如SPARC),编译64位模式的应用程序并没有给它任何好处,除非它可以有利地使用超过4GB的内存.它所做的就是增加二进制文件的大小,如果它影响缓存行为,实际上可以使代码变慢.

但是,x86-64不仅提供了64位地址空间和64位整数寄存器 - 它还使通用寄存器的数量增加了一倍,这在像x86这样的寄存器不足的体系结构上可以显着提高性能,只需重新编译.

它还允许编译器假设存在许多扩展,如SSE和SSE2,这也可以显着改善代码优化.

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

但是,如果应用程序对性能不敏感,那么这一点也不重要.

  • +1表示你可以假设SSE/SSE2 (8认同)
  • 使这些寄存器对编译器可见肯定有助于它进行优化 - 通常,可以在更高层执行的更多优化越好. (6认同)
  • 严格地说,x86-64不一定是实际寄存器数量的两倍.我相信所有桌面CPU都在执行管道中进行寄存器重命名,因此x86-64所有更改都是体系结构可见寄存器的数量,而不是实际数量.现在,这可以使编译器更有能力消除加载和存储操作,因此可以使用额外的架构寄存器启用代码提升等优化. (4认同)
  • 除了增加二进制文件的大小之外,它还会使每个指针使用的大小增加一倍,但是它的性能影响可能会集中在你注意到的"缓存行为"之下. (2认同)
  • 此外,x86-64增加了PC相对寻址,这有助于PIC代码. (2认同)

jal*_*alf 27

我还没有看到的一个可能的好处是,它可能会发现潜在的错误.将端口移植到64位后,会进行一些更改.某些数据类型的大小会发生变化,调用约定会更改,异常处理机制(至少在Windows上)会发生更改.

所有这些都可能导致隐藏的错误浮出水面,这意味着您可以修复它们.

假设您的代码是正确且没有错误的,理论上移植到64位应该像轻弹编译器开关一样简单.如果失败了,那是因为你依赖语言不能保证的东西,因此,它们是潜在的错误来源.

  • 嗯,这也是一个缺点:我希望你能抓住你自己新出现的错误,否则你将完成一些安全漏洞! (5认同)

sve*_*vec 17

这是64位为您做的:

  • 64位允许您使用比32位应用程序更多的内存.
  • 64位使所有指针都为64位,这使您的代码占用空间更大.
  • 64位为您提供更多的整数和浮点寄存器,这会导致寄存器中的寄存器更少,这会使您的应用程序有所加快.
  • 64位可以使64位ALU操作更快(仅在使用64位数据类型时才有用).
  • 你没有得到任何额外的安全性(另一个答案提到安全性,我不知道这样的任何好处).
  • 您仅限于在64位操作系统上运行.

我已经移植了许多C++应用程序,并看到使用64位代码加速10%(相同的系统,相同的编译器,唯一的变化是32位与64位编译器模式),但大多数应用程序是做了相当数量的64位数学.因人而异.

我不担心32位支持很快就会消失.

(编辑包括评论中的注释 - 谢谢!)

  • 如果您正在使用地址空间布局随机化,则可以在64位模式下获得额外的安全性.32位地址空间足够小,有时可能会被暴力破解.对于64位空间不是这样. (4认同)

小智 5

尽管32位将以某种形式存在一段时间,但Windows Server 2008 R2仅附带64位SKU.早在Windows 8中,随着更多软件迁移到64位,我不会对WOW64作为安装选项感到惊讶.WOW64是一种安装,内存和性能开销.32位Windows中的3.5GB RAM限制以及不断增加的RAM密度将促进此迁移.我宁愿拥有比CPU更多的内存......

拥抱64位!花点时间使您的32位代码与64位兼容,这是一个简单而直截了当的问题.对于正常应用程序,更改更准确地描述为代码更正.对于司机,选择是:适应或失去用户.到时候,您将准备好在任何平台上进行重新编译.

IMO目前的缓存相关问题没有实际意义; 该领域的硅改进和进一步的64位优化将即将到来.