指针和下标

指针有时比下标更有效率,前提是它们被正确的使用

下面举一个函数的例子,它的功能是把一个数组的内容复制到另一个数组

#define SIZE 50
int x[SIZE];
int y[SIZE];
int i;
int *p1, *p2;

 1、下标版本

// 下标版本
void try1() {
	for (i = 0; i < SIZE; i++) {
		x[i] = y[i];
	}
}

2、指针方案 

          --------------- 注意运算顺序,单目操作符的运算顺序为自右向左。先进行++,然后解引用

// 指针方案
void try2() {
	for (p1 = x, p2 = y; p1 - x < SIZE; ) {
		*p1++ = *p2++;   
	}
}

3、指针加计数器

// 指针加计数器
void try3() {
	for (i = 0, p1 = x, p2 = y; x < SIZE; i++) {
		*p1++ = *p2++;
	}
}

 4、寄存器指针变量

// 寄存器指针
void try4() {
	register int* p1;
	register int* p2;
	register int i;

	for (i = 0, p1 = x, p2 = y; x < SIZE; i++) {
		*p1++ = *p2++;
	}
}

 5、消除计数器------------最快的速度

//消除计数器
void try5() {
	register int* p1;
	register int* p2;

	for (p1 = x, p2 = y; p1 < &x[SIZE]; ) {
		*p1++ = *p2++;
	}
}

1. 对下标表达式 x[i] 求值时,先获取 i 的值,并且将 x 与整型长度(4)相乘, 会花费一定的时间和空间

2. 指针方案里,乘法运算出现在 for 语句的调整部分,指针变量自增的 1 这个值与整型长度(4)相乘,但这个乘法仅仅只是在编译期执行一次。

多次用下标 / 指针时, 指针的效率更高

 总结:

1.当根据某个固定数目的增量在一个数组中移动时,使用指针变量将比使用下标产生效率更高的代码。当这个增量是1并且机器具有地址自动增量模型时,这点尤为突出。

2.声明为寄存器变量的指针通常比位于静态内存和堆栈中的指针效率更高。

3.如果可以通过测试一些已经初始化并经过调整的内容来判断循环是否应该终止,那么久不需要使用一个单独的计数器。

4.那些必须在运行时求值的表达式较之诸如 &arr[SIZE] 或 arr + SIZE 这样的常量表达式往往代价更高。

但是!仅仅为了几十微秒的执行时间,是不是值得吧第1个容易理解的循环替换成最后一个“莫名其妙”的循环呢?

-------------偶尔是这样,但是大部分情况是否定的。

 在后面那种方法中:程序难以理解在前,难于维护在后。如果程序无法运行或无法维护,它的执行速度再快也无济于事。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值