Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基元数组是否需要整数作为索引_C#_C++_Arrays_Indexing_Primitive - Fatal编程技术网

C# 基元数组是否需要整数作为索引

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是否应该访问基本数组内容以获得最佳性能? 这里有一个例子

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每个对象一个字节,但对象计数非常大。问题更多的不是这个项目将要使用的解决方案或过早的优化。我只想知道这一点,无论当前使用情况如何。另请参见此处