一直以来都是把二维数组,当成一维数组,传递到函数函数中进行使用,下面一起来看下面的两组代码:
第一组:
#include "stdafx.h"
#include "iostream"
using namespace std;
#define REW 2
#define COL 2
void test(int table[REW][COL])
{
cout << table[0][1] << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
int table[REW][COL] = {0, 1, 2, 3};
test(table);
return 0;
}
第二组:
#include "stdafx.h"
#include "iostream"
using namespace std;
#define REW 2
#define COL 2
void test(int *table, int table_size)
{
cout << table[1] << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
int table[REW][COL] = {0, 1, 2, 3};
test((int *)table, 4);
return 0;
}
一直认为把二维当一维在函数中使用是很好的一种形式,不过需要在传参的时候把长度给传进去(其实这也是一种很方便的地方,因为相对于二维数组作为形参,你并不需要在一开始就限定数组的大小)
来看看具体的反汇编(其实都是差不多的,主要的性能应该在于传入,访问的时候就不用比较了,肯定一维比二维的访问更加速度):
test((int *)table, 4);
001644B4 6A 04 push 4
001644B6 8D 45 E8 lea eax,[table]
001644B9 50 push eax
001644BA E8 A1 CF FF FF call test (0161460h)
001644BF 83 C4 08 add esp,8
test(table);
00A144B4 8D 45 E8 lea eax,[table]
00A144B7 50 push eax
00A144B8 E8 A8 CF FF FF call test (0A11465h)
00A144BD 83 C4 04 add esp,4
分析一下:因为当形参是int *table的时候,函数并不知道每一行占多少个字节,所以在传入的时候需要让编译器知道这是一个int(说以加上了(int *))。
看看上边的两个,其实只是在最后一行有区别--------也就是两个参数需要8个字节空间和一个参数需要4个字节空间的区别。
综上,在使用二维数组的时候,用一维数组替代二维数组的形式,性能得到的提升还是挺不错的。。
不过用二维数组当做形参的优点也还是有的,比如比较方便……