很多时候你知道你的循环永远不会运行超过 x 次,其中 x 可以用 byte 或 short 表示,基本上是小于 int 的数据类型。
为什么我们使用 int 占用 32 位(对于大多数语言),而像字节这样的东西只有 8 位就足够了。
我知道我们有 32 位和 64 位进程,因此我们可以轻松地在一次行程中获取值,但它仍然会消耗更多内存。或者我在这里错过了什么?
更新:只是为了澄清。我知道速度方面没有区别。我在问对内存消耗的影响。
很多时候你知道你的循环永远不会运行超过 x 次,其中 x 可以用 byte 或 short 表示,基本上是小于 int 的数据类型。
为什么我们使用 int 占用 32 位(对于大多数语言),而像字节这样的东西只有 8 位就足够了。
我知道我们有 32 位和 64 位进程,因此我们可以轻松地在一次行程中获取值,但它仍然会消耗更多内存。或者我在这里错过了什么?
更新:只是为了澄清。我知道速度方面没有区别。我在问对内存消耗的影响。
在 C 中,“int”被定义为当前机器最有效的整数类型。
它通常与CPU的寄存器匹配,这样是最有效的。
使用较小类型的整数值可能会导致 CPU 级别的一些位移或位掩码,因此您不会获得任何收益...
访问与本机字大小相同的整数大小将是最有效的。使用一个字节几乎肯定需要与本机字大小一样多的空间,并且需要移位和屏蔽才能访问,因此没有任何好处。
实际上,除非您有非常非常大的循环或严格的时序限制,否则不会有太大的不同。
但与往常一样,使用最易读的东西,并首先使用基准/配置文件......
我几乎总是使用int
,除非有很好的理由不使用,只是因为每个人都总是使用它。这是为了避免下一个开发人员不得不花时间思考为什么他没有int
在这里使用 an ,是否有一些我需要了解的特殊原因。
我的代码越标准,以后越容易阅读。
在许多情况下,循环计数器只消耗一个处理器寄存器。将类型更改为 8 位或 16 位整数不会改变这一点,因为寄存器具有固定大小(32 位平台上的 32 位等)。
有时,循环计数器可能放在 RAM 中,例如当您从循环中调用函数时。那么,是的,您可能会浪费一些字节,但通常不足以担心。当使用不同于int
.
在Java 语言规范long
方面,关于and的使用有一个有趣的地方需要注意double
:
出于 Java 编程语言内存模型的目的,对非易失性 long 或 double 值的单次写入被视为两次单独的写入:每个 32 位一半。这可能会导致线程从一次写入中看到 64 位值的前 32 位,而从另一次写入中看到后 32 位。volatile long 和 double 值的写入和读取始终是原子的。对引用的写入和读取始终是原子的,无论它们是作为 32 位还是 64 位值实现的。鼓励 VM 实现者尽可能避免拆分其 64 位值。鼓励程序员将共享的 64 位值声明为 volatile 或正确同步他们的程序以避免可能的并发症。
很明显,这使得在循环变量中使用long
ordouble
的效率低于int
Java 内存模型中的 an,但实现的性能可能会有所不同。
我很想在这里添加一些东西,即使它是一个非常古老的线程。我不完全同意“我知道速度方面没有区别”。实际上,在 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% 。