實現memcpy
阿新 • • 發佈:2018-07-22
reg 功能 () gist 展開 signed 描述 情況 人工
問題描述:
模擬實現memcpy()函數的功能。
解題思路:
memcpy()和strcpy()功能一樣,只是memcpy()多了一個參數可以指定拷貝多少位。要實現其功能,需要考慮兩種情況:
- 當拷貝字符長度大於被拷貝字符長度時,需要從拷貝長度 - 1處開始遞減拷貝字符。
- 當拷貝字符長度小於被拷貝字符長度時,則直接從首地址依次遞增拷貝。
實現代碼:
void MyMemcpy(void *dst, const void *src, unsigned int len) { //關鍵字register,請求編譯器優化它定義的變量,並且通常這種優化比人工優化的好 register char *d; register char *s; if(0 == len) return dst; if(dst > src) { d = (char *)dst + len - 1; s = (char *)src + len - 1; while(len >= 4) //循環展開,提高執行效率 { *d-- = *s--; *d-- = *s--; *d-- = *s--; *d-- = *s--; len -= 4; } while(len--) { *d-- = *s--; } } else if(dst < src) { d = (char *)dst; s = (char *)src; while(len >= 4) { *d++ = *s++; *d++ = *s++; *d++ = *s++; *d++ = *s++; len -= 4; } while(len--) { *d++ = *s++; } } return dst; }
實現memcpy