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<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不是行优先也不是列优先,有兴趣可以另行研究)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值