亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如下所示,請問主要是那幾個判斷是什么意思,然后如何識別,及實現字對齊的呢?

如下所示,請問主要是那幾個判斷是什么意思,然后如何識別,及實現字對齊的呢?

慕工程0101907 2022-04-21 16:11:20
#define lsize sizeof(word)#define lmask (lsize - 1)void *memcpy(void *dest, const void *src, size_t count){char *d = (char *)dest;const char *s = (const char *)src;int len;if(count == 0 || dest == src)return dest;if(((long)d | (long)s) & lmask) {// src and/or dest do not align on word boundaryif((((long)d ^ (long)s) & lmask) || (count < lsize))len = count; // copy the rest of the buffer with the byte moverelselen = lsize - ((long)d & lmask); // move the ptrs up to a word boundarycount -= len;for(; len > 0; len--)*d++ = *s++;}for(len = count / lsize; len > 0; len--) {*(word *)d = *(word *)s;d += lsize;s += lsize;}for(len = count & lmask; len > 0; len--)*d++ = *s++;return dest;}
查看完整描述

1 回答

?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

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)) 中,記住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個。隨后的語句是指把先前面的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--)循環中的內容。

for(len = count & lmask; len > 0; len--)
*d++ = *s++;
因為lmask = 000……00011,則len = count & lmask即字符串的最后0~3個字符,所以最后的for是把整字之外剩余的零頭也copy過去

講的比較混亂,按這個思路仔細想象就行了。
Good luck!



查看完整回答
反對 回復 2022-04-24
  • 1 回答
  • 0 關注
  • 158 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號