a[i][j] 和 a[j][i] 的区别

先来一段代码:

#define MAX_LEN? 10000
int func()
{
	int i = 0, j = 0;
	int a[MAX_LEN?][MAX_LEN?];
	for (i=0; i

一般情况下我们都会习惯性的用a[i][j], 如果把a[i][j]换成a[j][i], 功能完全一样,但效果特别是性能上可能会有十倍甚至百倍的差别,原因何在?

写到这里,有的同学可能直接copy代码编译测试去了,而采用不同的语言(不同语言的实现要做调整)得到的结果还不一致,有的是a[i][j]好一些,有的则是a[j][i]好一些。

这个问题的核心在于:

     在内存使用上,程序访问的内存地址之间连续性越好,程序的访问效率就越高;相应地,程序访问的内存地址之间连续性越差

如果是行优先存储,就是一行的数据存放在一起,然后逐行存放,那么a[i][j]的效率要好一些

如果是列优先存储,就是每一列的数据是存储在一起的,一列一列地存放在内存中,那么a[j][i]的效率要好一些

行优先(Row-major)或者列优先(Column-major)取决于编程语言的实现,两者之间没有好坏,但其直接涉及到对内存中数据的最佳存储访问方式,所以我们在编程的时候要根据编程语言的特别来做针对性的优化,否则同样的逻辑跑出来的结果会有千差万别。

占据编程语言排行榜前几位的C/C++都是行优先(Java不是行优先也不是列优先,有兴趣可以另行研究)

你可能感兴趣的:(Linux,C)