我正在编写一个应用程序,想知道是应该以32位模式还是64位模式进行编译。该程序不使用任何64位类型,也不会访问超过4GB的内存(我也没有计划让它访问那么多内存)。我唯一能看到使用64位模式而不是32位模式的优点是,64位模式允许访问更多的寄存器,但当大多数64位特性未被使用时,使用32位模式是否有某些好处(除了较小的指令和指针,因为我不担心我的程序会溢出缓存)?是否有一些使用32位的好处,例如更快的指令或更少的能源消耗,这应该使我编译成32位呢?谢谢。
我正在编写一个应用程序,想知道是应该以32位模式还是64位模式进行编译。该程序不使用任何64位类型,也不会访问超过4GB的内存(我也没有计划让它访问那么多内存)。我唯一能看到使用64位模式而不是32位模式的优点是,64位模式允许访问更多的寄存器,但当大多数64位特性未被使用时,使用32位模式是否有某些好处(除了较小的指令和指针,因为我不担心我的程序会溢出缓存)?是否有一些使用32位的好处,例如更快的指令或更少的能源消耗,这应该使我编译成32位呢?谢谢。
这取决于应用程序类型。
如其他人所提到的,32位平台被认为是已废弃的,而在64位平台上运行32位应用程序会带来一些额外的开销。此外,正如您所提到的那样,编译器可以访问更多寄存器和更先进的指令集。
另一方面,对于某些场景,编译成32位代码将具有显着优势,这是由于本地指针大小较小。
例如,我有一个应用程序,其中包含“算法”代码,处理存储在复杂数据结构中的大型数据集与交叉指针。相同应用程序编译为32位平台时具有显着更小的内存占用量,并且运行速度更快。
因此,如果您的应用程序没有接近32位限制,使用本地指针处理复杂数据结构,并且性能至关重要,则32位可能是更好的选择。否则,建议切换到64位。
x32
架构。它是amd64
,但具有32位指针(换句话说,是64位架构,但具有较小的指针)。因此,您可以获得amd64
的寄存器,但是x86
的小指针大小。 - Tim Čas从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位寄存器。int
和long
。使用64位,因为在64位环境中运行32位会有开销(虽然很小)。
为什么不两个都编译呢?
我建议使用64位(AMD 64)。除了兼容性适用于真正老旧的计算机之外,32位(x86)应用程序没有任何优势。我相信比我更有知识的人可以指出AMD 64相对于x86的一些技术优势,但我怀疑这些在普通应用程序中并不会产生实质性差异。
但是没有什么阻止您同时编译和分发两者。