代码之家  ›  专栏  ›  技术社区  ›  uriDium

为什么整数总是用作for循环中的控制变量?

  •  16
  • uriDium  · 技术社区  · 15 年前

    通常情况下,当您知道循环的运行次数永远不会超过x次时,x可以用字节或短的形式表示,基本上是一个小于int的数据类型。

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

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

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

    6 回复  |  直到 15 年前
        1
  •  27
  •   siukurnin    15 年前

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

    它通常与CPU的寄存器相匹配,这就是它最有效的方式。

    使用较小类型的整数值可能会导致CPU级别的一些位移动或位屏蔽,因此您将不会获得任何增益…

        2
  •  8
  •   Mitch Wheat    15 年前

    访问与本机单词大小相同的整数大小将是最有效的方法。使用一个字节几乎肯定需要与本机单词大小一样多的空间,并且需要移动和屏蔽才能访问,因此没有什么可获得的。

    实际上,除非你有一个非常大的循环或者严格的时间限制,否则它不会有太大的区别。

    但和往常一样,使用最易读的东西,并且首先使用基准/概要文件…

        3
  •  7
  •   Hans Olsson    15 年前

    我几乎总是用 int 除非有很好的理由不这样做,因为每个人都会使用它。这是为了避免下一个开发人员不得不花时间思考 他为什么不用 int 这里,有什么特别的原因我需要知道吗

    更多 标准 我的代码是,将来读起来越容易。

        4
  •  6
  •   Fred Foo    15 年前

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

    有时,循环计数器可以放在RAM中,例如,当您从循环中调用函数时。然后,是的,您可能浪费了几个字节,但通常不足以让人担心。当使用不同于 int .

        5
  •  4
  •   Gary    15 年前

    关于 Java Language Specification 关于使用 long double :

    为了Java的目的 程序设计语言记忆模型 单次写入非易失性长或 双值被视为两个 单独写入:每32位一个 一半。这会导致一种情况 其中线程看到前32位 一次写入的64位值,以及 另一次写入的第二个32位。 写和读不稳定的长和 双值总是原子的。 对引用的写入和读取是 总是原子的,不管 它们被实现为32或64位 价值观。鼓励虚拟机实施者 避免拆分64位值 如果可能的话。程序员是 鼓励声明共享64位 值为volatile或synchronize 他们的程序要正确避免 可能的并发症。

    显然,这使得使用 长的 双重的 在循环变量中,比 int 在Java内存模型中,但实现可能在性能上有所不同。

        6
  •  0
  •   hivert    11 年前

    我很想在这里添加一些东西,即使这是一条很旧的线。我不完全同意“我知道速度是没有区别的”。实际上,在for循环中经常会有数组索引,比如in

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

    然后,即使您的数组的大小小于128,您将看到一个显著的速度差异 i 是一个 int 或A byte . 实际上,在 A[i] 处理器必须将整数转换成与指针大小相同的值。如果整数已经有相同的大小,那么就没有转换可以诱导更快的代码。 在64位的机器上,通过使用 long int 对于非常小的数组而不是 char (C/C++程序)。