memcpy memcpy頭文件


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 = **……**10100s = **……**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))中,記住lmask = 000……00011,所以(long)d ^ (long)s指d,s最低兩位若完全相同,如都為10,10或者01,01 , 或者11,11,(不可能同時為00 , 00),則((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個 。
【memcpy memcpy頭文件】2、隨后的語句是指把先前面的0~3個零頭字節復制掉,count -= len;for(; len > 0; len--)*d++ = *s++;否則,若d與s開始時就完全錯開,如(10,11)或者(count < lsize),判斷為真,指的是若d與s開始時就完全錯開 , 則逐字節復制即可,此時不可整字復制,或者雖然d和s是非整字對齊,如同為01,01 , 但是copy內容小于lsize(比如是4),不會存在大小為4byte的整字需要復制,則從d開始從頭到尾復制即可,即for(len = count / lsize; len > 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! 。
本文到此分享完畢,希望對大家有所幫助 。