For loop 为什么在for循环中总是使用整数作为控制变量?

For loop 为什么在for循环中总是使用整数作为控制变量?,for-loop,coding-style,memory-optimization,For Loop,Coding Style,Memory Optimization,通常,您知道循环的运行次数不会超过x次,其中x可以用字节或短数据类型表示,基本上是小于int的数据类型 为什么我们使用占32位的int(对于大多数语言),而一个字节就足够了,只有8位 我知道我们有32位和64位进程,因此我们可以在一次访问中轻松获取值,但它仍然会消耗更多内存。或者我在这里错过了什么 更新: 我只是想澄清一下。我知道速度方面没有区别。我在询问对内存消耗的影响。在许多情况下,循环计数器只消耗一个处理器寄存器。将类型更改为8位或16位整数不会改变这一点,因为寄存器具有固定大小(32位平

通常,您知道循环的运行次数不会超过x次,其中x可以用字节或短数据类型表示,基本上是小于int的数据类型

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

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

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

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


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

不同的东西时,存储和加载循环计数器实际上可能会更慢。访问与本机单词大小相同的整数大小将是最有效的。使用一个字节几乎肯定需要与本机字大小相同的空间,并且需要移位和屏蔽才能访问,因此没有任何好处

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

但和往常一样,只要可读性最好,就使用benchmark/profile…

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

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


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

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

越是标准我的代码,将来就越容易阅读。

就标准而言,关于
的使用,有一点值得注意:

为了Java的目的 程序设计语言记忆模型 单次写入非易失性长或长 双值被视为两个 单独写入:每32位写入一次 一半这可能导致一种情况 其中线程看到前32位 一次写入的64位值,以及 另一次写入的第二个32位。 写和读易失性长时间和长时间 双值总是原子的。 对引用的写入和读取是 始终是原子的,无论是否 它们实现为32位或64位 价值观鼓励VM实现者 避免拆分其64位值 如果可能的话。程序员是 鼓励声明共享64位 将值设置为可变或同步 正确使用他们的程序以避免 可能的并发症


显然,这使得在循环变量中使用
long
double
的效率低于Java内存模型中的
int
,但实现的性能可能会有所不同

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

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

for(i=0;i实际上,它被定义为“自然字号”,这可能是最有效的类型,也可能不是。对于最有效的类型,请使用C99的fastint_t。关于将编程的这些细节解谜的一些事情实际上非常令人兴奋。我更多的是询问内存消耗。内存消耗?请参阅Larsman的回答:通常,您的循环计数器在内存中不经常出现在寄存器中。总之ay对齐问题可能会导致变量的使用超出您的想象。我非常怀疑优化编译器不会简单地为
int
字符分配
int
的空间,如果事实上
int
效率更高的话。OTOH,我知道在大多数架构上
int和a
char
。真的吗?我见过的大多数代码都使用某种形式的无符号类型。@比利·奥尼尔:在一些嵌入式微处理器上,无符号类型可能比有符号类型提供更好的性能,但代价是需要更仔细地处理循环终止逻辑。另一方面,如果像ARM这样的处理器在32位微处理器中存储类似uint16的东西-位寄存器,它必须添加额外的代码将值“剪裁”为16位。对于int16,不需要这样的代码(因为当为int16分配一个超出-32768..32767范围的值时,允许发生任何事情,编译器可以让它的值做任何方便的事情)。您是否创建了足够多的循环计数器,以使更改它们的类型对内存消耗有明显的影响?如果是这样,那么我认为您的问题比只使用比所需更宽的类型更大。@supercat:我并不是说unsigned更好,它们将在大多数计算机上产生相同的影响。但是,在我所使用的大多数语言中,它们都会产生相同的影响请注意,任何标准类型的容器都会将大小或长度作为无符号类型返回,并且尝试在此类循环中使用
int
会导致编译器警告。(因为比较中有符号/无符号不匹配)@约翰·博德。一点也不。我只是想接受一些教育。我时不时地问我们为什么要以这种方式做一些事情。这一点很好。大多数人也知道并且能够理解I++语法。这很有趣。谢谢