C# 基元数组是否需要整数作为索引
int是否应该访问基本数组内容以获得最佳性能? 这里有一个例子C# 基元数组是否需要整数作为索引,c#,c++,arrays,indexing,primitive,C#,C++,Arrays,Indexing,Primitive,int是否应该访问基本数组内容以获得最佳性能? 这里有一个例子 int[] arr = new arr[]{1,2,3,4,5}; 数组的长度只有5个元素,所以索引不必是int,而是short或byte,如果使用byte而不是int,这将节省无用的3字节内存分配。当然,如果我知道数组不会溢出255的大小 byte index = 1; int value = arr[index]; 但这是否像听起来那么好 我担心这是如何在较低级别上执行的,索引是否被转换为int或其他操作,这实际上会减慢整个
int[] arr = new arr[]{1,2,3,4,5};
数组的长度只有5个元素,所以索引不必是int,而是short或byte,如果使用byte而不是int,这将节省无用的3字节内存分配。当然,如果我知道数组不会溢出255的大小
byte index = 1;
int value = arr[index];
但这是否像听起来那么好
我担心这是如何在较低级别上执行的,索引是否被转换为int或其他操作,这实际上会减慢整个过程,而不是优化它
索引是否被强制转换为int或其他操作,这实际上会减慢整个过程,而不是优化它
没有,但是
这将节省无用的3字节内存分配
保存3个字节不会带来任何好处 只有当你存储了大量的索引时,你所能节省的空间量才可能使它成为一项值得的投资
否则,使用一个普通的代码> INT/COD>,它是处理器的本机字大小,因此是最快的。
< P>在C和C++中,ARR[ index ]正式地等同于*(ARR+索引)。您对强制转换的担忧应该用一个更简单的问题来回答,即当需要向指针添加整数偏移量时,机器将做什么 我认为可以肯定地说,在大多数现代机器上,当向指针添加“字节”时,它将使用与向指针添加32位整数相同的指令。事实上,它仍然将使用机器字大小来表示那个字节,并填充一些未使用的空间。因此,这不会使使用阵列更快如果您需要在一个表中存储数百万个索引,那么您的优化可能会有所不同,然后使用byte而不是int将使用4倍的内存,并且移动内存所需的时间也会减少。如果要索引的数组很大,并且索引需要大于机器字端,那么这是另一种考虑。但我认为可以肯定地说,在大多数正常情况下,这种优化并没有真正意义,在所有条件相同的情况下,size_t可能是数组索引最合适的泛型类型(因为在大多数体系结构上,它与机器字大小完全对应).你可能想标记你正在使用的语言,这样人们就可以更容易地找到这篇文章。“保存3个字节不会有任何好处。”你怎么会没有呢?通过不在一级缓存中存储无用的3个字节来节省内存,并且在处理非常大的对象计数时会产生不同。@UmNyobe每个对象一个字节,但对象计数非常大。问题更多的不是这个项目将要使用的解决方案或过早的优化。我只想知道这一点,无论当前使用情况如何。另请参见此处