使用非 32 位整数是否合理

Is using a non-32-bit integer reasonable?

本文关键字:是否 整数      更新时间:2023-10-16

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

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

本质上,我的问题如下:

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

第一个问题的答案也应该澄清最后一个问题:如果您需要存储大量 16 位int,则可以节省 32 位int所需的一半内存量,并随之而来的任何"附加好处",例如更有效地使用缓存。

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

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

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

  3. 不,这通常是人们将short int值用于不需要long int范围的目的的原因。每个长度int分配的内存是不同的,就像short int占用的内存比long int少。优化的步骤之一是在范围不超过short int时将long int值更改为short int值,这意味着该值永远不会使用与long int分配的额外位。在处理数组中的许多元素或相同structclass的许多对象时,从这种优化中节省的内存实际上可能非常重要。

不同的int大小以不同数量的位存储在RAM和内部处理器缓存中。floatdoublelong double也是如此,尽管long double主要用于64位系统,大多数编译器如果在32位机器上运行,就会忽略long,因为32位累加器和ALU中的64位值在任何计算过程中都会被"砍掉",并且可能永远不会收到前32位的零。

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

它使用较少的内存。在正常情况下,它会使用一半的量。

"然后回到16位" - 我在这里正确吗?见上文。

它仅在您的代码需要时在 16 位和 32 位之间进行转换,而您未能显示。

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

No. 32 位处理器可以寻址并直接处理高达32 位的值。许多操作也可以对 8 位和 16 位值完成。

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

  1. 你不会获得性能,只会获得记忆。事实上,由于您刚才所说的话,您会失去性能,因为寄存器需要去除上位。
  2. 见上文
  3. 是取决于 CPU,不,它是 RAM 上的 16 位

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

性能来自缓存局部性。 缓存中容纳的数据越多,程序运行的速度就越快。 如果您有很多short值,则这一点更相关。

"然后回到16位" - 我在这里正确吗?

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

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

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


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