16

很多时候你知道你的循环永远不会运行超过 x 次,其中 x 可以用 byte 或 short 表示,基本上是小于 int 的数据类型。

为什么我们使用 int 占用 32 位(对于大多数语言),而像字节这样的东西只有 8 位就足够了。

我知道我们有 32 位和 64 位进程,因此我们可以轻松地在一次行程中获取值,但它仍然会消耗更多内存。或者我在这里错过了什么?

更新:只是为了澄清。我知道速度方面没有区别。我在问对内存消耗的影响。

4

6 回答 6

27

在 C 中,“int”被定义为当前机器最有效的整数类型。

它通常与CPU的寄存器匹配,这样是最有效的。

使用较小类型的整数值可能会导致 CPU 级别的一些位移或位掩码,因此您不会获得任何收益...

于 2010-11-17T13:36:15.697 回答
8

访问与本机字大小相同的整数大小将是最有效的。使用一个字节几乎肯定需要与本机字大小一样多的空间,并且需要移位和屏蔽才能访问,因此没有任何好处。

实际上,除非您有非常非常大的循环或严格的时序限制,否则不会有太大的不同。

但与往常一样,使用最易读的东西,并首先使用基准/配置文件......

于 2010-11-17T13:35:43.783 回答
7

我几乎总是使用int,除非有很好的理由不使用,只是因为每个人都总是使用它。这是为了避免下一个开发人员不得不花时间思考为什么他没有int在这里使用 an ,是否有一些我需要了解的特殊原因

我的代码越标准,以后越容易阅读。

于 2010-11-17T13:36:49.897 回答
6

在许多情况下,循环计数器只消耗一个处理器寄存器。将类型更改为 8 位或 16 位整数不会改变这一点,因为寄存器具有固定大小(32 位平台上的 32 位等)。

有时,循环计数器可能放在 RAM 中,例如当您从循环中调用函数时。那么,是的,您可能会浪费一些字节,但通常不足以担心。当使用不同于int.

于 2010-11-17T13:35:33.577 回答
4

Java 语言规范long方面,关于and的使用有一个有趣的地方需要注意double

出于 Java 编程语言内存模型的目的,对非易失性 long 或 double 值的单次写入被视为两次单独的写入:每个 32 位一半。这可能会导致线程从一次写入中看到 64 位值的前 32 位,而从另一次写入中看到后 32 位。volatile long 和 double 值的写入和读取始终是原子的。对引用的写入和读取始终是原子的,无论它们是作为 32 位还是 64 位值实现的。鼓励 VM 实现者尽可能避免拆分其 64 位值。鼓励程序员将共享的 64 位值声明为 volatile 或正确同步他们的程序以避免可能的并发症。

很明显,这使得在循环变量中使用longordouble的效率低于intJava 内存模型中的 an,但实现的性能可能会有所不同。

于 2010-11-17T13:55:02.983 回答
0

我很想在这里添加一些东西,即使它是一个非常古老的线程。我不完全同意“我知道速度方面没有区别”。实际上,在 for 循环中经常有数组索引,例如

for (i=0; i<len; i++) s = A[i]

然后,即使您的数组大小小于 128,无论i是 aint还是 a ,您都会看到显着的速度差异byte。实际上,要在A[i]处理器中执行指针运算,必须将整数转换为与指针大小相同的东西。如果整数已经具有相同的大小,则不存在导致更快代码的转换。long int在 64 位机器上,通过在非常小的数组上使用 for 循环索引而不是char(C/C++ 程序) ,我似乎可以将程序加速 20% 。

于 2014-02-20T17:45:33.003 回答