使用非32位整数合理吗?

时间:2012-12-20 02:59:11

标签: c++ types

  

可能重复:
  The importance of using a 16bit integer

如果今天的处理器执行(在标准条件下)32位操作 - 那么使用“short int”是否合理?因为为了对该数据执行操作,它会将其转换为32位(从16位)整数,执行操作,然后返回到16位 - 我想。那有什么意义呢?

本质上我的问题如下:

  1. 使用较小的范围整数带来什么(如果有)性能增益/阻碍?比如,如果不是使用标准的32位整数进行存储,而是使用16位的短整数。
  2. “然后再回到16位” - 我在这里是否正确?见上文。
  3. 是否所有整数数据都存储在CPU / RAM上的32位整数空间?

5 个答案:

答案 0 :(得分:5)

第一个问题的答案也应该澄清最后一个问题:如果你需要存储大量的16位int,你可以节省32位{{1}所需的一半内存量随着它可能伴随的任何“附带好处”,例如更有效地使用缓存。

目前,大多数CPU都有针对16位与32位操作的单独指令,以及从内存读取和写入16位值的指令。在内部,ALU可能正在执行32位操作,但上半部分的结果不会使其返回寄存器。

答案 1 :(得分:4)

  1. 处理器无需“扩展”值即可使用它。它只是用零填充未使用的空格,并在执行计算时忽略它们。所以,实际上,在short int上运行比long int更快,尽管今天的CPU速度很快,但很难注意到一点差异(双关语)。

    < / LI>
  2. 机器没有真正转换。当改变一个值的大小时,它要么向左填充零,要么完全忽略左边的额外位,这些位不适合目标存储区域。

  3. 不,这通常是人们将short int值用于不需要long int范围的目的的原因。分配的内存对于int的每个长度是不同的,就像short intlong int占用更少的内存位。优化的其中一个步骤是,当范围不超过long int时,将short int值更改为short int值,这意味着该值永远不会使用分配给的long int struct。在处理数组中的大量元素或同一classint的大量对象时,从这种优化中保存的内存实际上非常重要。

  4. 不同的float大小在RAM和内部处理器高速缓存中以不同的位数存储。对于doublelong doublelong double也是如此,尽管long主要用于64位系统,并且大多数编译器在运行时忽略{{1}}在32位机器上,因为32位累加器中的64位值&amp; ALU将在任何计算过程中被“删除”,并且可能永远不会收到任何除了前32位的零。

答案 2 :(得分:3)

  

使用较小的范围整数会带来什么(如果有)性能增益/阻碍?比如,如果不是使用标准的32位整数进行存储,而是使用16位的短整数。

它使用更少的内存。在正常情况下,它将使用一半。

  

“然后回到16位” - 我在这里是否正确?见上文。

如果你的代码需要它,那么它只会在16位和32位之间进行转换,而你无法显示。

  

所有整数数据都是在CPU / RAM上存储为32位整数空间吗?

没有。 32位处理器可以直接处理和使用最高 32位的值。许多操作也可以在8位和16位值上完成。

答案 3 :(得分:3)

否则不合理,除非你有某种(非常严格的)内存限制,你应该使用int

  1. 你没有获得表现,只有记忆。实际上,由于你刚刚说过的话,你会失去性能,因为寄存器需要去除高位。
  2. 见上文
  3. 是取决于CPU,不是它在RAM上的16位

答案 4 :(得分:1)

  

使用较小的范围会有什么(如果有的话)性能增益/阻碍   整数带来?比如,如果不是使用标准的32位整数   存储,我使用16位短整数。

性能来自缓存局部性。适合缓存的数据越多,程序运行的速度就越快。如果您有大量short值,则更相关。

  

“然后再回到16位” - 我在这里是否正确?

我对此不太确定。我原以为CPU可以并行优化多个操作,如果可以将数据打包成16位,则可以获得更大的吞吐量。也可能是这可能与其他32位操作同时发生。我在这里猜测,所以我会停下来!

  

所有整数数据都是在CPU / RAM上存储为32位整数空间吗?

没有。各种整数数据类型具有特定大小。但是,当您特别使用charshort时,可能会遇到结构内部的填充。


速度效率不是唯一的问题。显然,你有存储优势,以及内在行为(例如,我编写了特定于性能的代码,它利用unsigned short的整数溢出,这样我就不必做任何模数)。您还可以使用特定的数据大小来读取和写入二进制数据。可能还有更多我没有提到的,但你明白了这一点=)