C语言中,多维数组和多个数组,哪一种更效率?

数组两种定义的方式:a[100][3]和b1[100]b2[100]b3[100]遍历时,用:for(i....)for(j....)a[i][j];和for(i...)b1[i];for(i...)b2[i];for(i...)b3[i];哪一种更快?更效率?

如果你学过编译了你就知道多维数组的访问比一位数组在编译时要更加复杂,在符号表中需要保存的内情向量也会跟大。就用你给出的例子说明:a[i][j]实际对应的内存偏移地址是由base(a)+(i*array(a,1)+j)*sizeof(a)这个公式计算得来的。其中base(a)表示数组a的基地址,而array(a,1)表示数组a的一维维度大小。而b[i]对应的偏移地址则是由base(b)+i*sizeof(b)。而对数组元素的访问实际就是对数组元素所对应的内存偏移地址的访问。由此可见数组每多一维,在访问其变量时就得多做一次乘法,并且编译后生成的中间代码也会更长,效率自然要低。
但是,我个人推荐没有必要非得为这点效率而回避多维数组。其一,是因为在连续访问多维数组时,你的编译器会为你做优化,从而大大提高访问效率,优化后的效率损失可以忽略不计。其次,如果数组是在堆上分配的,那就是一片连续的内存空间。比几片零散的空间更加规整。再者,如果你写有关多维矩阵的程序。固执的使用低维数组会大大增加程序复杂度并降低可读性,甚至效率反而会降低。总之,我们还是不要捡了芝麻,丢了西瓜的好。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-02-04
双重循环没有单重循环快的.理论上是多个数组快.但是多个数组使用不方便.
第2个回答  2012-02-04
后边的时间是O(n)
前边的是O(m*n)
两个不是一个数量级的
所以一边情况下是后边的快一些
第3个回答  2012-02-04
泪啊,以前我也问过我老师(他说没啥区别)。变成汇编看周期才能知道
相似回答