以字符串拷贝函数为例,解析数组中下标与指针的效率情况。
指针的效率至少和下标相同。(原因参考C下标的实现原理,注意编译器差异,因为部分编译器针对下标设置了特殊汇编指令,不做考虑)
#define SIZE 50
int x[SIZE];
int y[SIZE];
int i;
int *p1,*p2;
1:使用下标方案
void strcpy()
{
for(i=0;i
x[i] = y[i];
}
2:改用指针方案
void strcpy()
{
for(p1 = x,p2 = y; p1-x
}
3:只用计数器方案
void strcpy()
{
for(i = 0, p1 =x, p2= y; i
*p1++ = *p2++;
}
4:寄存器方案
void strcpy()
{
register int *p1, *p2, i;
for(i = 0, p1=x ,p2 = y;i
*p1++ = *p2++;
}
5:消除计数器
void strcpy()
{
register int *p1,*p2;
for(p1 = x, p2= y; p1< &x[SIZE];*p1++= *p2++);
}
以上5中实现,前三种性能基本相同,第四种稍好,第五种最高(基本上无法再提高了)。
注意:性能和可读性难以兼得,性能要求不高,建议第一种,直接明了;对于性能要求极高,比如实时性系统,只建议第五种。
------------------------------------------
C库的字符串复制函数实现如下:
void strcpy(char *buffer, char const *string)
{
while(*buffer++ = *string++) != '\0');
}
更加简洁和高效,原因是充分利用了字符串结尾的'\0'标志。也由此给大家一个建议,如果是自定义类型的数组,不妨也设一些结束标志,以便编写操作函数时方便。类似的如字符串数组就以NUL(不是NULL)作为结束标志。