如果今天的处理器执行(在标准条件下)32位操作 - 那么使用“short int”是否合理?因为为了对该数据执行操作,它会将其转换为32位(从16位)整数,执行操作,然后返回到16位 - 我想。那有什么意义呢?
本质上我的问题如下:
答案 0 :(得分:5)
第一个问题的答案也应该澄清最后一个问题:如果你需要存储大量的16位int
,你可以节省32位{{1}所需的一半内存量随着它可能伴随的任何“附带好处”,例如更有效地使用缓存。
目前,大多数CPU都有针对16位与32位操作的单独指令,以及从内存读取和写入16位值的指令。在内部,ALU可能正在执行32位操作,但上半部分的结果不会使其返回寄存器。
答案 1 :(得分:4)
处理器无需“扩展”值即可使用它。它只是用零填充未使用的空格,并在执行计算时忽略它们。所以,实际上,在short int
上运行比long int
更快,尽管今天的CPU速度很快,但很难注意到一点差异(双关语)。
机器没有真正转换。当改变一个值的大小时,它要么向左填充零,要么完全忽略左边的额外位,这些位不适合目标存储区域。
不,这通常是人们将short int
值用于不需要long int
范围的目的的原因。分配的内存对于int
的每个长度是不同的,就像short int
比long int
占用更少的内存位。优化的其中一个步骤是,当范围不超过long int
时,将short int
值更改为short int
值,这意味着该值永远不会使用分配给的long int
struct
。在处理数组中的大量元素或同一class
或int
的大量对象时,从这种优化中保存的内存实际上非常重要。
不同的float
大小在RAM和内部处理器高速缓存中以不同的位数存储。对于double
,long double
和long double
也是如此,尽管long
主要用于64位系统,并且大多数编译器在运行时忽略{{1}}在32位机器上,因为32位累加器中的64位值& ALU将在任何计算过程中被“删除”,并且可能永远不会收到任何除了前32位的零。
答案 2 :(得分:3)
使用较小的范围整数会带来什么(如果有)性能增益/阻碍?比如,如果不是使用标准的32位整数进行存储,而是使用16位的短整数。
它使用更少的内存。在正常情况下,它将使用一半。
“然后回到16位” - 我在这里是否正确?见上文。
如果你的代码需要它,那么它只会在16位和32位之间进行转换,而你无法显示。
所有整数数据都是在CPU / RAM上存储为32位整数空间吗?
没有。 32位处理器可以直接处理和使用最高 32位的值。许多操作也可以在8位和16位值上完成。
答案 3 :(得分:3)
否则不合理,除非你有某种(非常严格的)内存限制,你应该使用int
答案 4 :(得分:1)
使用较小的范围会有什么(如果有的话)性能增益/阻碍 整数带来?比如,如果不是使用标准的32位整数 存储,我使用16位短整数。
性能来自缓存局部性。适合缓存的数据越多,程序运行的速度就越快。如果您有大量short
值,则更相关。
“然后再回到16位” - 我在这里是否正确?
我对此不太确定。我原以为CPU可以并行优化多个操作,如果可以将数据打包成16位,则可以获得更大的吞吐量。也可能是这可能与其他32位操作同时发生。我在这里猜测,所以我会停下来!
所有整数数据都是在CPU / RAM上存储为32位整数空间吗?
没有。各种整数数据类型具有特定大小。但是,当您特别使用char
和short
时,可能会遇到结构内部的填充。
速度效率不是唯一的问题。显然,你有存储优势,以及内在行为(例如,我编写了特定于性能的代码,它利用unsigned short
的整数溢出,这样我就不必做任何模数)。您还可以使用特定的数据大小来读取和写入二进制数据。可能还有更多我没有提到的,但你明白了这一点=)