12

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

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

本质上,我的问题如下:

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

5 回答 5

5

你的第一个问题的答案也应该澄清最后一个问题:如果你需要存储大量 16-bit ints,你可以节省 32-bit 所需内存量的一半,int以及可能出现的任何“附带好处”有了它,比如更有效地使用缓存。

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

于 2012-12-20T03:05:49.950 回答
4
  1. 处理器不需要“扩展”一个值来使用它。它只是用零填充未使用的空格,并在执行计算时忽略它们。因此,实际上,在 a 上运行short int比在 a 上运行更快long int,尽管使用当今的快速 CPU,即使是一点点差异也很难注意到(双关语)。

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

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

在 RAM 和内部处理器高速缓存中存储不同int大小的位数不同。float, double, 和也是如此long double,尽管long double主要用于 64 位系统,大多数编译器只是忽略longif 在 32 位机器上运行,因为 32 位累加器和 ALU 中的 64 位值将被“删除”在任何计算期间,可能永远不会收到前 32 位的零以外的任何内容。

于 2012-12-20T03:23:01.200 回答
3

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

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

“然后回到 16 位”——我在这里正确吗?往上看。

如果您的代码需要,它只会在 16 位和 32 位之间转换,而您未能显示。

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

不,32 位处理器可以直接处理高达32 位的值。也可以对 8 位和 16 位值进行许多操作。

于 2012-12-20T03:10:25.127 回答
3

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

  1. 你不会获得性能,只是记忆。事实上,由于您刚才所说的,您会失去性能,因为寄存器需要去除高位。
  2. 往上看
  3. 是的,取决于 CPU,不,它在 RAM 上是 16 位的
于 2012-12-20T03:15:17.530 回答
1

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

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

“然后回到 16 位”——我在这里正确吗?

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

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

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


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

于 2012-12-20T03:27:17.763 回答