编译为32位或64位

时间:2018-02-24 16:04:07

标签: c compilation 32bit-64bit

我正在编写应用程序,我想知道是否应该在32位模式或64位模式下编译它。该程序不使用任何64位类型,并且不能访问超过4千兆字节的内存(我不会计划访问那么多内存)。我在32位模式下使用64位模式时可以看到的唯一优势是64位模式允许访问更多寄存器,但在大多数情况下使用32位模式而不是64位模式必须有一些好处没有使用64位功能(除了较小的指令和指针,因为我不担心我的程序溢出缓存)。使用32位是否有一些好处,例如更快的指令或更少的能耗,这应该导致我编译为32位。谢谢。

5 个答案:

答案 0 :(得分:1)

使用64位,因为在64位环境中运行32位会产生开销(尽管很小)。

答案 1 :(得分:1)

取决于应用程序类型。

正如其他人所提到的,32位平台被认为已被弃用,而在64位平台上运行32位应用程序会产生一些开销。另外,正如您所提到的,编译器可以访问更多寄存器和更高级的指令集。

OTOH在某些情况下,由于本机指针的大小较小,编译为32位的代码会有很大的优势。

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

因此,如果您的应用程序没有接近32位限制,则使用具有本机指针的复杂数据结构,并且性能至关重要 - 32位可能是一种方法。否则我建议切换到64位。

答案 2 :(得分:1)

WoW64(AMD64 / x64)上的

Intel 64不需要指令仿真。在这种情况下,WoW64子系统仅通过32位应用程序和64位Windows API之间的附加层来模拟32位环境。在某些地方,这层很薄,有些则稍厚。对于平均程序,由于此层,您可能会受到2%的性能损失。对于某些程序,它可能更大。百分之二不是很多,但请记住,在64位Windows下32位应用程序的工作速度比在32位环境中慢一些。

64位代码的编译不仅可以避免使用WoW64,还可以为您带来额外的性能提升。这可以通过微处理器中的架构修改来解释,例如增加通用寄存器的数量。对于普通程序,仅重新编译后,您可能会获得5-15%的性能提升。

由于WoW64层,32位程序在64位环境中的效率低于其原生32位程序。但是,简单的32位应用程序仍然可以获得在64位环境中执行的一个好处。也许您知道使用交换机“/ LARGEADDRESSAWARE:YES”构建的程序可以分配最多3 GB的内存,如果使用交换机“/ 3gb”启动32位Windows。那么,在64位系统上构建的相同32位程序可以分配大约4 GB的内存(实际上通常大约为3.5 GB)。

P.S。另请参阅“第2课Support of 32-bit applications in the 64-bit Windows environment”。

答案 3 :(得分:1)

您在64位模式下的寄存器访问改进是正确的,但您可能不知道差异有多大。

as Reinier Melian suggested

  

从AMD Opteron处理器开始,扩展了x86架构   32位寄存器以类似的方式进入64位寄存器   发生了16到32位的扩展。 R前缀标识64位   寄存器(RAX,RBX,RCX,RDX,RSI,RDI,RBP,RSP,RFLAGS,RIP),以及   另外还有8个64位通用寄存器(R8-R15)   介绍了x86-64的创建。 然而,这些扩展是   仅在64位模式下可用 ...

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

由于三个寄存器在任何情况下都是程序计数器,堆栈指针和帧指针,因此可用通用寄存器的差异更为显着。

只需将编译标志从-m32更改为-m64,就可以有效地从五个或六个32位寄存器转到13或14个64位寄存器。

除非您有特定需要在较旧的32位硬件或操作系统上部署,否则没有理由编译32位x86应用程序。

小心将代码移植到64位。还有太多程序员将指针与intlong混为一谈。

答案 4 :(得分:0)

为什么不在两者中编译它?

我推荐64位(AMD 64)。除了真正旧计算机的兼容性之外,32位(x86)应用程序没有任何优势。我相信比我知识渊博的人可以指出AMD 64胜过x86的一些技术优势,但我怀疑这些优点对你的普通应用程序没有什么影响。

但没有什么能阻止你编译和分发两者。