让我们想象一个存储数值的嵌套(二维)10x10 数组。我通常看到的迭代值的经典方法是嵌套循环,顺序读取第一个“行”的元素,然后转到下一个。
如果这些行中的每一行都占用一个单独的内存区域,则将有 10 次通过这些区域的转换,以及对行中各个元素的 10 次访问。
(模式:元素=数组[X][Y])据我所知,访问行(X)比访问其中的元素(Y)花费更多的计算资源。
问题: 当非顺序访问数组元素时,并且行间跳转更加频繁(总共会产生超过 10 次转换),搜索时间会增加吗?
让我们想象一个存储数值的嵌套(二维)10x10 数组。我通常看到的迭代值的经典方法是嵌套循环,顺序读取第一个“行”的元素,然后转到下一个。
如果这些行中的每一行都占用一个单独的内存区域,则将有 10 次通过这些区域的转换,以及对行中各个元素的 10 次访问。
(模式:元素=数组[X][Y])据我所知,访问行(X)比访问其中的元素(Y)花费更多的计算资源。
问题: 当非顺序访问数组元素时,并且行间跳转更加频繁(总共会产生超过 10 次转换),搜索时间会增加吗?
您没有指出您实际上想要哪种二维数组。那么我们就来看最简单的一个:
int arr[10][10];为了“跳”得更猛烈,我们逐行、逐列地总结一下……
让我们编译并查找汇编代码中的差异。
你也没有看出区别吗? :)
好吧,让我们关闭优化。循环看起来相同,对数组元素的调用也相同:
所以对于数组来说
int[][],内存是一块分配的,本质上没有什么区别。尤其是这种大小的数组,当整个数组可以轻松放入处理器缓存中时......但如果你考虑
差异最终会出现。但你不太可能在 10x10 矩阵上捕捉到它。现在在 1000x1000 下更加真实。请参阅此处的代码和结果: https: //bit.ly/3Y091w6
你的好奇心满足了吗?