影响拷贝速度的因素
- 一次循环拷贝数据的字节数
- 地址是否对齐
在地址不对齐的情况下,memset和memcpy在是一个char到char的拷贝的循环,一个字节一个字节的拷贝
在地址对齐的情况下,按照4字节的长度拷贝,提升拷贝效率
void *memset4(void *src, int c, size_t n)
{
char *tmpsrc;
int tmp;
if (src == NULL)
return NULL;
tmpsrc = (char*)src;
//判断源地址是否按4字节对齐,二进制位最后两位是否为0
if ((unsigned long)tmpsrc & 0x3){
while (n--)
*tmpsrc++ = (char) c;
}
else {
size_t wordnum;
size_t slice;
wordnum = n/sizeof(int);
slice = n % (sizeof(int));
c = c&0xff;//取低8位
tmp = c + (c << 8) + (c << 16) + (c << 24);
while (wordnum--){
*(int *)tmpsrc = tmp;
tmpsrc += 4;
}
while (slice--)
*tmpsrc++ = (char) c;
}
return src;
}
void *memcpy4(void *dest, const void *src, size_t n)
{
char *p_dest, *p_src;
if ((dest == NULL) || (src == NULL))
return NULL;
p_dest = (char *)dest;
p_src = (char *)src;
//判断源地址和目的地址是否按4字节对齐,若对齐则一次拷贝4个字节
if (((unsigned long)p_dest & 0x3) || ((unsigned long)p_src & 0x3)){
while(n--)
*p_dest++ = *p_src++;
}
else {
size_t wordnum;
size_t slice;
wordnum = n/sizeof(int);
slice = n % (sizeof(int));
while (wordnum--){
*(int *)p_dest = *(int *)p_src;
p_dest += 4;
p_src += 4;
}
while (slice--)
*p_dest++ = *p_src++;
}
return dest;
}