C语言自己实现一个memcpy函数
目录
- 按字节拷贝实现memcpy
- 按4字节拷贝实现memcpy
- Tips
在 C 语言中,我们可以自己实现 memcpy 函数来实现内存数据的拷贝操作。memcpy 函数用于将指定长度的数据从源地址复制到目标地址。
按字节拷贝实现memcpy
#include <stdio.h>void* my_memcpy_byte(void* dst, const void* src, int n)
{if (dst == NULL || src == NULL || n <= 0)return NULL;char* pdst = (char*)dst;char* psrc = (char*)src;//判断目标内存区域和源内存区域是否有重叠if (pdst > psrc && pdst < psrc + n) {//如果有重叠,就从尾部开始遍历pdst = pdst + n - 1;psrc = psrc + n - 1;while (n--)*pdst-- = *psrc--;}else{while (n--)*pdst++ = *psrc++;}return dst;
}int main(void)
{char str[] = "HelloWorld";char* str1 = &str[0];char* str2 = &str[1];my_memcpy_byte(str1, str2, 5);printf("%s\n", str); //输出elloWWorldreturn 0;
}
按4字节拷贝实现memcpy
#include <stdio.h>void* my_memcpy_byte(void* dst, const void* src, int n)
{if (dst == NULL || src == NULL || n <= 0)return NULL;int* pdst = (int*)dst;int* psrc = (int*)src;char* pdstTemp = NULL;char* psrcTemp = NULL;int byte4Count = n / 4; //有多少个4字节,按4字节拷贝int byteCount = n % 4; //剩余字节数按字节拷贝//判断目标内存区域和源内存区域是否有重叠,如果有从后往前,如果没有从前往后if (pdst > psrc && pdst < (char*)psrc + n){pdstTemp = (char*)pdst + n - 1;psrcTemp = (char*)psrc + n - 1;while (byteCount--){*pdstTemp-- = *psrcTemp--;}pdstTemp++;psrcTemp++;pdst = (int*)pdstTemp;psrc = (int*)psrcTemp;pdst--;psrc--;while (byte4Count--){*pdst-- = *psrc--;}}else{while (byte4Count--){*pdst++ = *psrc++;}pdstTemp = (char*)pdst;psrcTemp = (char*)psrc;while (byteCount--){*pdstTemp++ = *psrcTemp++;}}return dst;
}int main(void)
{char str[] = "HelloWorld";char* str1 = &str[0];char* str2 = &str[1];my_memcpy_byte(str1, str2, 1);printf("%s\n", str);return 0;
}
Tips
对比字节拷贝,4字节拷贝速度是提高不少。
但是需要注意,void *dst, const void *src这两个参数是需要按4字节对齐的,如果本身不是4字节对齐,按4字节拷贝效率也会变低。