在64位机器上,指针是8字节(64位)。在32位机器上,它们是4字节(32位)。因此,我们可以通过指针的大小来确定我们正在处理什么,这是最简单的形式:
#define IS_64BIT (sizeof(void *) == 8)
64位机器并不比32位机器运行得更快,除非进行64位数学计算或需要超过4GB的RAM。
64位AMD(以及后来的英特尔)机器比32位x86机器运行得更快,因为当AMD设计新指令集时,他们增加了更多的CPU寄存器,并将SSE数学作为默认选项。
32位x86系统可能会浪费大量的CPU时间在RAM中传输数据,而x86_64系统可以将该数据存储在CPU寄存器中。寄存器比一级CPU缓存要快得多。拥有更多寄存器还可以节省需要将寄存器的旧值存储在RAM中,从RAM中加载不同值,然后再从RAM中加载原始值的CPU指令。
在某些特别缺乏寄存器的情况下,额外的寄存器可以使程序的速度提高30%。但是通常效益远不止于此。
假设SSE2带来的速度优势很多。在32位CPU中,SSE指令可能存在,也可能不存在,因此,为了使用它们,软件需要具备笨拙的测试代码和两个(或更多!)数学函数实现。大多数软件并不太关心,因此它从不费心,总是回到486时代的x87 FPU数学。64位CPU将SSE2作为指令集的必需部分,因此所有x86_64程序都可以假设它存在,并在所有情况下使用它。
实际上,您在这里询问了几件不同的事情。
首先是CPU。大多数现代CPU(大约过去5年)都支持64位。
现在仅因为CPU支持它,并不意味着操作系统支持它,这就是您需要选择64位操作系统或32位操作系统(32位也被称为x86,x86指的是CPU指令集中的一些小技术差异,但对于大多数常见用途,x86和32位是可以互换的)
即使操作系统支持它,也不意味着您运行的特定程序支持64位。大多数(如果不是全部?)64位操作系统都具有32位仿真模式,因此您仍然可以运行32位程序。
现在回答您如何确定您正在运行哪种架构的问题,最可靠的方法是通过某些API调用向操作系统询问。
至于为什么64位有时被认为更快,因为使用32位只能寻址4GB内存,而使用64位时,由地址空间引起的限制要高得多(大约高出40亿倍),并且限制因素是硬件而不是地址空间。至于何时以及为什么更多的内存更快,则是一个完全不同的话题。
64位计算机并不会本质上运行得更快。它只能支持更高的精度(更大的整数,更精确的浮点数)。
在一些罕见的情况下,库可能会将两个32位数字压缩成64位以执行大量并行操作,可能导致潜在的最多2倍的加速。这可能发生在某些高度优化的科学/数值库中,或者在某些特殊应用程序中(由于某种原因)已经在非常低的级别上进行了高度优化。例如,一些多媒体软件。需要注意的是,即使在32位模式下,这样的应用程序也可以进行这种权衡,但选择不这样做;他们仅仅为了并行性而牺牲了精度(他们可能不需要)。
显示更快性能(可能<10%的改进)的操作系统基准测试并不一定与64位相关的优化有关。64位架构可能与拥有更多寄存器或程序可以利用的高级功能相关 [引用:http://www.tuxradar.com/content/ubuntu-904-32-bit-vs-64-bit-benchmarks],这可能是性能差异的原因(以及其他变量)。
如何确定 CPU 是 32 位还是 64 位取决于您使用的操作系统。例如,在 Linux 上,您可以调用 uname -a ,但可能有更好的方法来执行此操作。如果您正在使用 C/C++,请参见其他答案以了解在程序中确定它的方法。