void* mymemcpy(void *dst,void *src,size_t count)
{
char *tmp, *s;/*如果目标地址小于源地址的话,从头开始拷贝*/
if (dest <= src) {
tmp = (char *) dest;
s = (char *) src;
while (count--)
*tmp++ = *s++;
}
/*如果目标地址大于源地址的话,从尾部往前拷贝,这样就避免了当内存重叠时导致拷贝出错*/
else {
tmp = (char *) dest + count;
s = (char *) src + count;
while (count--)
*--tmp = *--s;
}
return dest;
}
有意思的memcpy优化
void
* mymemcpy( void* dest, const void* src, size_t count )
{
char* d = (char*)dest;
const char* s = (const char*)src;
int n = (count + 7) / 8; // count > 0 assumed
switch( count & 7 )
{
case 0:
do
{
*d++ = *s++;
case 7:
*d++ = *s++;
case 6:
*d++ = *s++;
case 5:
*d++ = *s++;
case 4:
*d++ = *s++;
case 3:
*d++ = *s++;
case 2:
*d++ = *s++;
case 1:
*d++ = *s++;
} while (--n > 0);
}
return dest;
}
看懂没,看懂它为啥比一个个复制快么?呵呵。
int n = (count + 7) / 8;计算要复制的轮数(每轮复制8位),剩下的余数位数也要复制进去。
count & 7控制要复制余数位数,while (--n > 0)控制轮数。
比如count = 9,则n = 2,count & 7 = 1,要复制2轮,程序跳到case1执行,复制一位之后,再循环一轮,复制8位。
它优化的地方是减少了判断是否复制完的次数。
{
char* d = (char*)dest;
const char* s = (const char*)src;
int n = (count + 7) / 8; // count > 0 assumed
switch( count & 7 )
{
case 0:
do
{
*d++ = *s++;
case 7:
*d++ = *s++;
case 6:
*d++ = *s++;
case 5:
*d++ = *s++;
case 4:
*d++ = *s++;
case 3:
*d++ = *s++;
case 2:
*d++ = *s++;
case 1:
*d++ = *s++;
} while (--n > 0);
}
return dest;
}
看懂没,看懂它为啥比一个个复制快么?呵呵。
int n = (count + 7) / 8;计算要复制的轮数(每轮复制8位),剩下的余数位数也要复制进去。
count & 7控制要复制余数位数,while (--n > 0)控制轮数。
比如count = 9,则n = 2,count & 7 = 1,要复制2轮,程序跳到case1执行,复制一位之后,再循环一轮,复制8位。
它优化的地方是减少了判断是否复制完的次数。