16位整数对32位整数对64位整数

问题描述 投票:17回答:4

由于我从未接受过计算机科学的“正规”教育(我正在读高中,所以很长一段时间以来一直对此感到疑惑,所以请原谅我对此问题的无知。

在支持标题中列出的三种整数的平台上,哪个更好,为什么? (我知道每种int的内存长度都不同,但是我不确定这意味着什么或它如何影响性能,或者从开发人员的角度来看,哪一种比另一种更具优势。)

谢谢您的帮助。

memory 64-bit int 32-bit 16-bit
4个回答
25
投票

“”更好“是一个主观术语,但是某些整数在某些平台上的性能更高。

例如,在32位计算机(由32位平台和Win32之类的术语引用)中,CPU被优化为一次处理32位值,而32是指CPU的位数。可以在一个周期内消耗或生产。 (这是一个非常简单的解释,但可以理解总体思路。)>

在64位计算机(最新的AMD和Intel处理器属于此类)中,CPU被优化为可以一次处理64位值。

因此,在32位平台上,将16位整数加载到32位地址中需要将16位清零,以便CPU可以对其进行操作;一个32位整数将立即可用,而无需进行任何更改,并且一个64位整数将需要在两个或多个CPU周期内进行操作(一次用于低32位,然后再次用于高32位) 。

相反,在64位平台上,16位整数需要将48位清零,32位整数需要将32位清零,并且64位整数可以立即进行操作。

每个平台和CPU都有“本机”位(例如32或64),这通常会限制该CPU可以访问的其他一些资源(例如3GB / 4GB内存限制为32-位处理器)。 80386处理器家族(以及后来的x86)处理器制定了32位标准,但是现在AMD和Intel等公司目前正在制定64位标准。


9
投票

要回答第一个问题,使用16位vs 32位vs 64位整数取决于所使用的上下文。因此,您不能说一个真的比另一个更好。但是,根据情况,优选彼此使用。考虑这个例子。假设您有一个拥有1000万用户的数据库,并且想存储他们的出生年份。如果您在数据库中使用64位整数创建一个字段,则您已经耗尽了80 MB的存储空间。相反,如果要使用16位字段,则只会使用20 MB的存储空间。您可以在此处使用16位字段,因为人们的出生年份小于最大的16位数字。换句话说,1980、1990、1991 <65535,假设您的字段未签名。总而言之,这取决于上下文。我希望这会有所帮助。


4
投票

一个简单的答案是使用您知道的最小范围内的最小值。


1
投票

取决于是否应该优化速度或存储。如果您对速度感兴趣并且以64位模式运行SQL Server,则需要64位密钥。在64位模式下运行的64位处理器经过优化,可以使用64位数字和地址。同样,以32位模式运行的64位处理器也已优化为使用32位数字和地址。例如,在64位模式下,堆栈上的所有压入和弹出操作均为8字节等。同样,从高速缓存和内存中提取的数据也针对64位数字和地址进行了优化。就像处理器一样,以64位模式运行的处理器可能需要更多的机器周期来处理32位数字,就像处理16位数字的处理器一样,需要更多的机器周期。处理时间的增加有很多原因,但是请考虑一下内存对齐的示例:32位数字可能未在64位整数边界上对齐,这意味着加载该数字需要在将其加载到内存后对其进行移位和屏蔽寄存器。至少必须在每个操作之前屏蔽每个32位数字。我们谈论的是在64位模式下处理32或16位整数时,至少使处理器的有效速度减半。

© www.soinside.com 2019 - 2024. All rights reserved.