memcpy函数实现(memcpy)
关于memcpy函数实现,memcpy这个很多人还不知道,今天小六来为大家解答以上的问题,现在让我们一起来看看吧!
1、d,s是两个字符型指针,分别指向目标传位置和源传位置在判断 if(((long)d | (long)s) & lmask) 中,举个具体的例子假设是32位计算机,字长 word= 32/8 为4,即占4个byte,则lmask = 000……00011则d与s若是对齐的,应只有第三位及更高位不同(从低位算起)则(long)d | (long)s的最低两位一定是00,例如 d = **……**10100 s = **……**00100,则(long)d | (long)s = **……**10100,此时((long)d | (long)s) & lmask = 0,即对齐的话不做if中的语句,直接从整字开始copy内存内容否则,((long)d | (long)s) & lmask 非0,进入if语句:if((((long)d ^ (long)s) & lmask) || (count =lsize,即判断为假,则len = lsize - ((long)d & lmask);其中((long)d & lmask)指d中后两位1的个数,为0个,1个,2个或者3个,而lsize - ((long)d & lmask)既是从d开始放,到下一个整字开始前还有几个空位,只能相应的为3个,2个,1个或者0个。
2、随后的语句是指把先前面的0~3个零头字节复制掉,count -= len; for(; len > 0; len--) *d++ = *s++;否则,若d与s开始时就完全错开,如(10,11)或者(count 0; len--)循环中的内容。
3、for(len = count & lmask; len > 0; len--) *d++ = *s++;因为lmask = 000……00011,则len = count & lmask即字符串的最后0~3个字符,所以最后的for是把整字之外剩余的零头也copy过去讲的比较混乱,按这个思路仔细想象就行了。
4、Good luck!。
本文到此分享完毕,希望对大家有所帮助。