编译成32位还是64位?(涉及IT技术)

6

我正在编写一个应用程序,想知道是应该以32位模式还是64位模式进行编译。该程序不使用任何64位类型,也不会访问超过4GB的内存(我也没有计划让它访问那么多内存)。我唯一能看到使用64位模式而不是32位模式的优点是,64位模式允许访问更多的寄存器,但当大多数64位特性未被使用时,使用32位模式是否有某些好处(除了较小的指令和指针,因为我不担心我的程序会溢出缓存)?是否有一些使用32位的好处,例如更快的指令或更少的能源消耗,这应该使我编译成32位呢?谢谢。


2
32位已经被弃用。唯一的优点是可以在旧电脑上运行。 - zx485
5个回答

3

这取决于应用程序类型。

如其他人所提到的,32位平台被认为是已废弃的,而在64位平台上运行32位应用程序会带来一些额外的开销。此外,正如您所提到的那样,编译器可以访问更多寄存器和更先进的指令集。

另一方面,对于某些场景,编译成32位代码将具有显着优势,这是由于本地指针大小较小。

例如,我有一个应用程序,其中包含“算法”代码,处理存储在复杂数据结构中的大型数据集与交叉指针。相同应用程序编译为32位平台时具有显着更小的内存占用量,并且运行速度更快。

因此,如果您的应用程序没有接近32位限制,使用本地指针处理复杂数据结构,并且性能至关重要,则32位可能是更好的选择。否则,建议切换到64位。


如果性能很重要,32位可能是一个可行的选择。在32位x86中,仅有8个32位寄存器,其中三个是程序计数器、堆栈指针和帧指针。如果使用帧指针作为通用寄存器,你最多可以获得整整六个寄存器。如果运行64位,则可以访问双倍数量的寄存器——16个。 - Andrew Henle
1
@AndrewHenle:是的,有很多寄存器。但性能并不总是受寄存器数量的限制。我确实观察到,“算法”代码在32位上由于较少的内存I/O而更快。 - valdo
这就是为什么基准测试很重要 - 包括硬件基准测试。我曾经有过全新的惠普服务器,它们在运行真实代码时比它们所取代的五年前由Sun构建的x86服务器更快。系统性能不仅仅取决于CPU规格和MB上塞入多少RAM。但由于购买往往是基于CPU规格和RAM数量进行的,供应商往往会在像内存延迟和IO带宽这样的事情上节省成本。 - Andrew Henle
@AndrewHenle:在Linux中,存在一种x32架构。它是amd64,但具有32位指针(换句话说,是64位架构,但具有较小的指针)。因此,您可以获得amd64的寄存器,但是x86的小指针大小。 - Tim Čas

3
你已经正确理解了64位模式下的寄存器访问优化,但你可能不知道这种差异有多大。

根据维基百科

从AMD Opteron处理器开始,x86架构通过类似于16到32位扩展的方式将32位寄存器扩展为64位寄存器。R前缀标识64位寄存器(RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP、RFLAGS、RIP),在创建x86-64时还引入了另外八个64位通用寄存器(R8-R15)。然而,这些扩展仅在64位模式下可用...

在x86上,以64位模式运行可以访问16个64位寄存器。在32位模式下,只能访问8个32位寄存器。

由于其中三个寄存器是程序计数器、堆栈指针和帧指针,在可用的通用寄存器方面的差异更加显著。

所以,只需将编译标志从-m32更改为-m64,您就可以从五到六个32位寄存器变成13或14个64位寄存器。
除非您有特定的需要在旧的32位硬件或操作系统上部署应用程序,否则真的没有理由编译32位x86应用程序。
但是,在将代码移植到64位时要小心。仍然有太多的程序员混淆指针和intlong

2
Intel 64(AMD64 / x64)上,WoW64 不需要指令仿真。在这种情况下,WoW64子系统通过32位应用程序和64位Windows API之间的附加层仅模拟32位环境。在某些地方,这个层很薄,而在其他地方则比较厚。对于一个普通程序,你可能会因为这个层面有2%的性能损失。对于一些程序来说,它可能会更大。虽然2%不是很多,但请记住,在64位Windows下,32位应用程序的工作速度比在32位环境下慢一些。
编译64位代码不仅可以避免使用WoW64,还可以获得额外的性能提升。这是由于微处理器中的体系结构修改,例如通用寄存器数量的增加。对于一个普通程序,仅重新编译就可以期望获得5-15%的性能提升。
由于WoW64层的存在,32位程序在64位环境中的效率比本机32位环境低。然而,简单的32位应用程序仍然可以从在64位环境中执行中获得一个好处。也许您知道,使用开关“/LARGEADDRESSAWARE:YES”构建的程序可以分配高达3GB的内存,如果32位Windows使用开关“/3gb”启动。同样,在64位系统上构建的32位程序可以分配近4GB的内存(实际上通常约为3.5GB)。
附:另请参见“第2课:64位Windows环境下对32位应用程序的支持”。

1

使用64位,因为在64位环境中运行32位会有开销(虽然很小)。


1

为什么不两个都编译呢?

我建议使用64位(AMD 64)。除了兼容性适用于真正老旧的计算机之外,32位(x86)应用程序没有任何优势。我相信比我更有知识的人可以指出AMD 64相对于x86的一些技术优势,但我怀疑这些在普通应用程序中并不会产生实质性差异。

但是没有什么阻止您同时编译和分发两者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接