原始数组期望整数作为索引

本文关键字:索引 整数 数组 期望 原始 | 更新日期: 2023-09-27 18:07:59

应该通过int访问原始数组内容以获得最佳性能吗?下面是一个例子

int[] arr = new arr[]{1,2,3,4,5};

数组的长度只有5个元素,所以索引不必是int,但短或字节,这将节省无用的3字节内存分配,如果使用字节而不是int。当然,如果我知道数组不会溢出大小为255就好了。

byte index = 1;
int value = arr[index];

但是这真的像听起来那么好吗?

我担心的是如何在较低的级别执行,是否index被强制转换为int或其他操作,这实际上会减慢整个过程,而不是优化它。

原始数组期望整数作为索引

在C和c++中,arr[index]在形式上等价于*(arr + index)。你对类型转换的关注可以用一个更简单的问题来回答:当机器需要给指针添加一个整数偏移量时,它会怎么做?

认为可以肯定地说,在大多数现代机器上,当你向指针添加一个"字节"时,它将使用与向指针添加一个32位整数相同的指令。实际上,它仍然会用机器字长来表示那个字节,填充一些未使用的空间。所以这不会使使用数组更快

如果你需要在一个表中存储数百万个这样的索引,那么你的优化可能会有所不同,然后使用byte而不是int将使用4倍的内存,并且花费更少的时间来移动内存。如果要索引的数组非常大,并且索引需要大于机器字端,那么这是另一种考虑。但我认为可以肯定地说,在大多数正常情况下,这种优化并没有真正意义,size_t可能是最合适的泛型类型,对于所有条件相等的数组索引(因为在大多数体系结构中,它完全对应于机器字长)。

将index强制转换为int或其他操作,这实际上会减慢整个过程,而不是优化它

没有,但

将节省无用的3字节内存分配

节省3个字节没有任何好处。

只有当你存储一个巨大的索引数组时,你所节省的空间量可能会使它成为值得的投资。

否则坚持使用普通的int,它是处理器的本机字长,因此是最快的。