失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > a[i][j] 和 a[j][i] 的区别

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

时间:2019-08-10 14:21:04

相关推荐

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

先来一段代码:

#define MAX_LEN? 10000int func(){int i = 0, j = 0;int a[MAX_LEN?][MAX_LEN?];for (i=0; i<MAX_LEN; i++){for (j=0; i<MAX_LEN; j++){a[il[j] = 1;// a[j][i] = 1?}}...return 0;}

一般情况下我们都会习惯性的用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不是行优先也不是列优先,有兴趣可以另行研究)

如果觉得《a[i][j] 和 a[j][i] 的区别》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。