如何以编程方式检测64位或32位机器?

时间:2011-05-08 15:07:38

标签: 64-bit 32bit-64bit 32-bit

我不明白32位和64位是什么意思。似乎人们说64位计算机运行速度更快 - 但为什么呢?这是否意味着有64位整数而不是32位?如果它是这样的,有没有办法编写程序来确定我们是在32位还是64位机器上?

4 个答案:

答案 0 :(得分:6)

在64位机器上,指针是8个字节(64位)。在32位机器上,它们是4个字节(32位)。因此,我们可以通过指针的大小来确定我们正在处理的内容,它是最简单的形式:

#define IS_64BIT (sizeof(void *) == 8)

唯一的缺点是在32位模式下运行的64位计算机将注册为32位。当然,这对于所有意图和目的来说并不重要,因为64位计算机上的32位操作系统将是32位计算机。

答案 1 :(得分:3)

实际上你在这里问了几件不同的事情。

首先是CPU。大多数现代CPU(在过去5年内)将支持64位。

现在只是因为CPU支持它并不意味着OS支持它,那就是你有64位操作系统或32位操作系统(32位也称为x86,那里& #39; x86中的小技术差异是指CPU指令集,但对于大多数常见用法,x86和32位是可互换的)

即使操作系统支持它,也不代表您运行的特定程序支持64位。大多数(如果不是全部?)64位操作系统所做的是它们具有32位仿真模式,因此您仍然可以运行32位程序。

现在,关于如何确定您正在运行的体系结构的问题,最可靠的方法是通过某种API调用来询问操作系统。

至于为什么64位有时被认为更快,因为32位只能解决4GB的内存,而64位的地址空间限制要高得多(大约40亿)时间更高)限制因素是硬件而不是地址空间。至于何时以及为什么更多的内存更快,这完全是一个单独的主题。

答案 2 :(得分:2)

64位计算机的运行速度不会超过32位计算机,除非正在进行64位数学运算或需要超过4 GB的RAM。

64位AMD (以及后来的英特尔)机器比32位x86机器运行得更快,因为当AMD设计新指令集时,他们添加了更多CPU寄存器并使SSE数学成为默认值。

32位x86系统会浪费大量CPU时间在RAM中推送数据,而x86_64系统可以将这些数据存储在CPU寄存器中。寄存器比一级CPU缓存快得多。拥有更多寄存器还可以节省CPU指令,否则需要将寄存器的旧值存储在RAM中,从RAM加载不同的值,然后从RAM中加载原始值。

在一些特别是寄存器缺乏的情况下,额外的寄存器可以为程序提高30%的速度。收益通常远低于此。

假设SSE2的速度有很多好处。在32位CPU中,SSE指令可能存在也可能不存在,因此要使用它们,软件需要具有笨拙的测试代码和两个(或更多!)数学函数的实现。大多数软件都不够关心,因此它从不困扰,总是从486天回到x87 FPU数学。 64位CPU使SSE2成为指令集的必需部分,因此所有x86_64程序都可以自由地假设它存在并在所有情况下都使用它。

答案 3 :(得分:-1)

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 ++,请参阅另一个答案,了解在程序中确定它的方法。