一、引用
1.linux C编程:重写 memcpy 函数_memcpy_fromio_老王不让用的博客-CSDN博客
2.实现一个高效率的内存拷贝函数memcpy_高效 内存复制函数_wykup的博客-CSDN博客
以上两篇博客提供了很大思路,但是考虑到实际面试当中的时间等问题,结合以上两篇实现如下代码
//max_dest_len:接收buff的最大长度
//count:需要拷贝的字节长度
void *Memcpy(void *dest, size_t max_dest_len, const void *src, size_t count)
{ int nbyte = sizeof(long long);int byte8count =count/nbyte; /*按每次8字节拷贝*/int byte1count =count%nbyte; /*剩余的按字节拷贝*/long long* ds = (long long*)dest; long long* ss = (long long*)src; char * dts = NULL;char * sts = NULL;if(max_dest_len < count)return ;if((dest > src) && (dest < src+count)) //地址向后重叠{ds = (long long *)((long long)dest +count-nbyte);ss = (long long *)((long long )dest +count-nbyte);while(byte8count--) *ds-- = *ss--;ds++;ss++;dts = (char *)ds;sts = (char *)ss;while(byte1count--){*(char *)dts-- = *(char *)sts--; } }else{ //地址向前重叠或者不重叠while (byte8count--)*ds++ = *ss++;dts = (char *)ds;sts = (char *)ss;while (byte1count--)*(char *)dts++ = *(char *)sts++; }return dest;
}
此代码可运行
核心思路(兼顾时间、实现难度等):
1.地址重叠,主要考虑向后重叠
2.效率,这里是以8字节的方式去拷贝
3.32位和64位机器数据结构所占字节的区别