数组----下标与指针效率问题
2014-09-25 09:07
337 查看
有关数组指针与下标的效率,是一个一直困扰大家的问题。指针可能不会那么容易理解,下标的可读性会更好。但是,选择下标往往可能会影响效率。
最近看《C和指针》,有2个例子我觉得很好,很能说明这个问题,下面我把这两个例子与大家分享一下。
下面的例子中将数组中的所有元素都设置为0:
例1:
(1)数组下标:
int array[10], a;
for(a = 0; a < 10; a += 1)
array[a] = 0;
为了对下标表达式求值,编译器在程序中插入指令,取得a的值,并把它与整形的长度(也就是4)相乘。这个乘法需要花费一定的时间和空间。
(2)指针:
int array[10], *ap;
for(ap = array; ap < array + 10; ap++)
*ap = 0;
ap++中,++其实就是在ap当前指针所指的位置处,加上一个ap所指元素的类型的长度,这里就是int,即4。也就是1必须与整形的长度(也就是4)相乘,然后再与指针相加。
从这里,貌似两个循环都进行了乘法,好像没有什么差异。可是,你注意到没有2个循环其实是有很大的不同的。不同在哪里呢???
仔细看,会发现数组下标中的a每次的值是不同的,每次a都会与长度4进行相乘,即进行了10次乘法。
再看看指针,你会发现ap++时,是1与长度4进行相乘,再与指针相加。每次执行乘法时,其实就是1*4。这个乘法只在编译时进行了一次运算。程序执行的时候,就没有进行乘法运算,只是简单的将4与指针相加而已。
有没有明白呢?上面的例子是指针比下标更有效率的一个典型。你会发现在这个场合中 -- 当你在数组中1次1步(或某个固定的数字)地移动时,与固定数字相乘的运算在编译时完成,所以运行时所需的指令就少一些。在绝大多数机器上,程序竟会更小一些、更快一些。
下面,我们再说一个指针与下标的效率完全相同的场合。
例2:
(1)数组下标:
a = getValue();
array[a] = 0;
(2)指针:
a = getValue();
*(array + a) = 0;
这个例子中,a可能是任何值,在运行时才会得知。2个方案都必须进行乘法指令(因为a是运行时得到的),用于对a的值进行调整。
有没有发现,指针的效率总是会大于等于下标。其实,原因是在编译时,下标总是要转换为指针的。
注:不要为了效率上细微的差别而牺牲可读性。
有关数组指针与下标的效率,是一个一直困扰大家的问题。指针可能不会那么容易理解,下标的可读性会更好。但是,选择下标往往可能会影响效率。
最近看《C和指针》,有2个例子我觉得很好,很能说明这个问题,下面我把这两个例子与大家分享一下。
下面的例子中将数组中的所有元素都设置为0:
例1:
(1)数组下标:
int array[10], a;
for(a = 0; a < 10; a += 1)
array[a] = 0;
为了对下标表达式求值,编译器在程序中插入指令,取得a的值,并把它与整形的长度(也就是4)相乘。这个乘法需要花费一定的时间和空间。
(2)指针:
int array[10], *ap;
for(ap = array; ap < array + 10; ap++)
*ap = 0;
ap++中,++其实就是在ap当前指针所指的位置处,加上一个ap所指元素的类型的长度,这里就是int,即4。也就是1必须与整形的长度(也就是4)相乘,然后再与指针相加。
从这里,貌似两个循环都进行了乘法,好像没有什么差异。可是,你注意到没有2个循环其实是有很大的不同的。不同在哪里呢???
仔细看,会发现数组下标中的a每次的值是不同的,每次a都会与长度4进行相乘,即进行了10次乘法。
再看看指针,你会发现ap++时,是1与长度4进行相乘,再与指针相加。每次执行乘法时,其实就是1*4。这个乘法只在编译时进行了一次运算。程序执行的时候,就没有进行乘法运算,只是简单的将4与指针相加而已。
有没有明白呢?上面的例子是指针比下标更有效率的一个典型。你会发现在这个场合中 -- 当你在数组中1次1步(或某个固定的数字)地移动时,与固定数字相乘的运算在编译时完成,所以运行时所需的指令就少一些。在绝大多数机器上,程序竟会更小一些、更快一些。
下面,我们再说一个指针与下标的效率完全相同的场合。
例2:
(1)数组下标:
a = getValue();
array[a] = 0;
(2)指针:
a = getValue();
*(array + a) = 0;
这个例子中,a可能是任何值,在运行时才会得知。2个方案都必须进行乘法指令(因为a是运行时得到的),用于对a的值进行调整。
有没有发现,指针的效率总是会大于等于下标。其实,原因是在编译时,下标总是要转换为指针的。
注:不要为了效率上细微的差别而牺牲可读性。
相关文章推荐
- 数组的下标访问和指针访问方式效率分析比较
- C语言 数组 下标与指针 效率解析
- 数组的下标访问和指针访问方式效率分析比较
- 使用数组、指针的效率问题
- 数组的下标访问和指针访问方式效率分析比较
- (2)int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
- 关于字符串 字符数组 字符型指针的问题
- 关于数组和指针的一些基本问题
- 数组、数组名和指针问题
- 指针数组作为函数参数的使用问题
- CString及Char指针和数组的问题
- 约瑟夫环问题的 PHP 实现--使用 PHP 数组内部指针操作函数
- 数组类型与数组指针的巧妙利用 - 回复 "Delphier" 的问题
- 字符数组与字符指针赋初值问题
- QP实现之函数指针数组无法获取正确地址的问题
- CString及Char指针和数组的问题 (1)
- 字符指针与字符数组的存储问题
- (转)数组名与指针问题
- 二维字符数组与二维整型数组在内存中的分配及指针的问题
- C语言中 数组到底是不是指针和数组作为参数问题