判断需要拷贝的字节数是否大于临界值(16或8)。如果小于,直接按照one byte by one byte来拷贝。如果大于:
1、先进行内存对齐。假设要拷贝的目的地址如下所示
其中start为拷贝目的地的起始地址 ,end为拷贝目的地的结束地址,align border为内存中的对齐边界。
BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ); //传的参数为(-dstp) % OPSIZ),就是对齐需要拷贝的字节数
2、此时的len
就为对齐之后的剩余大小了,之后的处理方式直接按照虚拟内存页的大小来加快拷贝效率。
/* Copy whole pages from SRCP to DSTP by virtual address manipulation,as much as possible. */
PAGE_COPY_FWD_MAYBE (dstp, srcp, len, len);
3、如果后面还有剩余部分,还可以采用一个字一个字拷贝:
WORD_COPY_FWD (dstp, srcp, len, len);
/* Fall out and copy the tail. */
4、剩余的不能采用word copy的尾部使用one byte by one byte进行拷贝。
参考:
(170条消息) glibc--memcpy源码分析_astrotycoon的博客-CSDN博客
(170条消息) glibc memcpy() 源码浅谈_杨博东的博客的博客-CSDN博客