我们为什么要为C ++应用程序构建64位目标?

时间:2013-04-11 12:26:26

标签: c++ 32bit-64bit

这是我的一个非常基本的疑问。我不是IT或CS人员,所以请尝试用简单的语言解释。 现在为什么我问这个问题是因为我们可以运行64位和64位的应用程序32位操作系统。 AFAIK 64位数据类型占用的内存比32位应用程序多两倍。此外,64位应用程序只能在64位操作系统上运行。 那么为什么要构建64位应用程序呢? 也许这就是为什么Firefox只能在32位中使用??? 对不起,如果这个问题不符合SO的标准,但我不能控制停止思考同样的问题。 谢谢。

更新:不知何故,似乎有一种混乱。 我不是故意要问为什么我们需要64位架构机器。 我知道32位机器只能使用4GB RAM& 64位机器有更高的限制。 我在质疑为什么我们需要构建64位应用程序!

4 个答案:

答案 0 :(得分:10)

除了上面给出的显而易见的原因(主要是“使用超过2-3GB的内存”),编译为64位的原因是x86-64有16个寄存器,其中x86-32有8个。这些寄存器是堆栈指针,通常rBP保留用于“帧指针”,实际有用的寄存器数分别为6和14。例如,附加寄存器允许在寄存器中传递更多数量的参数,并且在函数内的寄存器中保存更多数量的临时变量。这对代码的实际执行速度具有积极影响,因为每次使用存储器而不是寄存器时,至少它会导致更复杂的指令,并且经常需要使用额外的指令。当没有足够的寄存器时,这反过来会使代码更大。

通常情况下,64位x86代码运行速度提高了约5-15%,而且没有对实际算法进行任何修改,并且通常具有。有时算法可以更改以获得更多[因为例如你可以有一个由“电话号码”索引的数组,而不是散列电话号码然后索引散列,或者使用64位整数值代替32位的,意味着“一半的操作”加速2倍。

如果您需要从应用程序获得性能,则必须进行基准测试(在多个平台上)。有些情况下,例如,较大的指针,意味着缓存变得更快,代码最终运行得更慢,因为“只有一半的链表项适合缓存”。

简而言之:在大多数情况下,64位应用程序比32位应用程序做同样的事情要快。

答案 1 :(得分:6)

最重要的用例是当你真的想为你的进程消耗超过2千兆字节的内存时。

接下来的事情是32位支持将慢慢下降,就像你现在不会看到很多16位应用程序一样。但这是一个缓慢的过程。目前有一个版本的Windows Server 2008默认情况下没有32位支持。

最后,有时你只需要64位 - 这就是当你构建一个加载到64位消费者进程中的任何类型的扩展时。由于64位进程无法加载32位代码,因此必须为它们提供64位扩展,或者制定互操作解决方案以使您的代码处于单独的进程中 - 后者并非总是可行且有时非常低效。

答案 2 :(得分:4)

  • 物理内存

32位系统架构只能直接寻址4 GB的地址空间。运行64位版Windows Server的64位系统架构最多可支持1,024 GB的物理和可寻址内存。

  • 更好的并行处理

使用32位架构的服务器受限(Windows操作系统)为32个CPU。并行处理和总线架构的改进使64位环境能够支持多达64个处理器,并为每个额外的处理器提供几乎线性的可扩展性。

  • 更快的总线架构

64位架构提供了更多更广泛的通用寄存器,有助于提高整体应用速度。当存在更多寄存器时,不需要将持久数据写入存储器,然后必须在稍后的几条指令中将其读回。函数调用在64位环境中也更快,因为一次可以将多达四个参数传递给函数。

答案 3 :(得分:1)

数据类型的大小不会随x64自动加倍,但处理器的大小会像指针大小一样注册。使用32位,您可以处理4294967295字节的内存(~4 Gb),这对于某些应用程序(如数据库管理系统,...)来说并不适用。

由于兼容性问题,Firefox仅提供32位版本。您不能为x86(32位)体系结构编写库并从x64处理器调用它们,因为它们的指针不兼容(如上所述)。同时创建:x64 x86版本会增加测试费用。如果您的应用程序很少使用超过3.5 Gb的内存,那么它实际上并不会从x64架构中获利。

32位程序也不能简单地在x64架构上运行。在Windows上有一个用于此的层,称为Windows on Windows (WoW),或者用于x64 / x86接口的WoW64。通过各种缓存案例,x86应用程序在WoW上的运行速度可能比本机x64应用程序的运行速度快,也可以这样做。