有时候你知道你的循环永远不会超过x次,其中x可以用byte或short表示,基本上是一个小于int的数据类型。
为什么我们使用占用32位(大多数语言)的int,就像一个字节就足够只有8位。
我知道我们有32位和64位进程,因此我们可以在一次旅行中轻松获取值,但它仍会消耗更多内存。或者我在这里缺少什么?
更新: 只是为了澄清。我知道速度明智没有区别。我问的是对内存消耗的影响。
答案 0 :(得分:27)
在C中,“int”被定义为当前机器的最有效整数类型。
它通常与CPU的寄存器匹配,这就是它最有效的方式。
使用较小类型的整数值可能会导致CPU级别的某些位移或位屏蔽,因此您无法获得增益...
答案 1 :(得分:8)
访问与本机字大小相同的整数大小将是最有效的。使用一个字节几乎肯定需要与原始字大小一样多的空间,并且需要移位和屏蔽才能访问,所以没有什么可以获得的。
实际上,除非你有一个非常非常大的循环或严格的时序限制,否则它不会产生太大的影响。
但与往常一样,使用最易读的内容,首先使用基准/配置文件......
答案 2 :(得分:7)
我几乎总是使用int
,除非有充分的理由不这样做,因为每个人都会使用它。这是为了避免下一个开发人员不得不花时间思考为什么他不在这里使用int
,是否有一些特殊原因我需要了解。
我的代码越多标准,将来就越容易阅读。
答案 3 :(得分:6)
在许多情况下,循环计数器仅消耗一个处理器寄存器。将类型更改为8位或16位整数不会改变,因为寄存器具有固定大小(32位平台上的32位等)。
有时,循环计数器可以放在RAM中,例如当你从循环中调用一个函数时。然后,是的,你可能会浪费几个字节,但通常不足以担心。当使用与int
不同的东西时,存储和加载循环计数器实际上可能会更慢。
答案 4 :(得分:4)
就Java Language Specification而言,long
和double
的使用值得注意:
出于Java的目的 编程语言记忆模型,a 单次写入非易失性长或 double值被视为两个 单独写入:每个32位一个 半。这可能导致一种情况 线程看到前32位的位置 一次写入的64位值,和 另一个写入的第二个32位。 写入和读取volatile和long double值总是原子的。 写入和读取引用是 总是原子的,不管是否 它们实现为32位或64位 值。鼓励VM实现者 避免分割他们的64位值 在可能的情况。程序员是 鼓励声明共享64位 值为volatile或同步 他们的程序正确避免 可能的并发症。
显然,这使得在循环变量中使用long
或double
的效率低于Java内存模型中的int
,但实现的性能可能会有所不同。
答案 5 :(得分:0)
我很想在这里添加一些东西,即使它是一个非常古老的线程。我并不完全同意“我知道速度明智没有区别”。实际上,通常在for循环中存在数组索引,例如
for (i=0; i<len; i++) s = A[i]
然后,即使您的数组大小小于128,您也会看到显着的速度差异,i
是int
还是byte
。实际上,要在A[i]
中执行指针运算,处理器必须将整数转换为与指针大小相同的整数。如果整数已经具有相同的大小,则没有转换会导致更快的代码。
在64位机器上,通过在非常小的数组而不是long int
(C / C ++程序)上使用char
来获取循环索引,我看起来在程序上的速度提高了20%。