使用非32位整数合理吗?

use*_*181 12 c++ types

可能重复:
使用16位整数的重要性

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

本质上我的问题如下:

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

das*_*ght 5

你的第一个问题的答案也应该澄清最后一个问题:如果你需要存储大量的16位ints,你可以节省32位ints 所需内存量的一半,无论可能带来什么"附带好处"用它,比如更有效地使用缓存.

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


rse*_*thc 4

  1. 处理器不需要“扩展”一个值来使用它。它只是用零填充未使用的空间,并在执行计算时忽略它们。short int因此,实际上,在 a 上运行比在 a 上运行要快long int,尽管使用当今快速的 CPU 很难注意到哪怕一点点的差异(双关语)。

  2. 机器并没有真正转换。当更改值的大小时,它要么向左侧填充零,要么完全忽略左侧不适合目标内存区域的额外位。

  3. 不,这通常是人们将值用于不需要short inta 范围的目的的原因。long int每个长度分配的内存都不同int,就像 ashort int比 a 占用更少的内存位一样long int。优化的步骤之一是将long int值更改为short int范围不超过 a 的值short int,这意味着该值永远不会使用 a 分配的额外位long int。当处理数组中的大量元素或相同structclass.

不同的int大小在 RAM 和内部处理器缓存中存储不同数量的位数。floatdouble和也是如此long double,尽管long double主要针对 64 位系统,并且大多数编译器只是忽略long在 32 位机器上运行的 if,因为 32 位累加器和 ALU 中的 64 位值将被“削减”在任何计算过程中,除了前 32 位的零之外,可能永远不会收到任何内容。