關於memcpy 的實現

2021-09-13 13:46:33 字數 924 閱讀 5625

關於memcpy的實現很多同學可能一開始有和我一樣的想法,就是將src的內容乙個位元組乙個位元組的複製到dest中。這樣實現方法未嘗不可,但是我們都知道cpu每次取存記憶體中的資料時,是按照位址匯流排大小來訪問的。以32位的cpu為例子,cpu每次訪問資料都是一次4個位元組(32位)為最小單位訪問的。但按照我們前面所說的方法實現的memcpy,在拷貝大於4位元組記憶體時,cpu需要拷貝4次以上。但我們如果每次拷貝的時候都是按照cpu最大訪問位元組數來訪問的話,在理想的情況是不是可以將拷貝的時間縮小為原來的1/4的時間。

此段**是在openwrt原始碼中 build_dir/host/u-boot-2018.03/lib/string.c

void * memcpy(void *dest, const void *src, size_t count)

}/* 對剩下的不夠按unsigned long位元組數拿去的資料按char方式拷貝 */

/* copy the reset one byte at a time */

d8 = (char *)dl;

s8 = (char *)sl;

while (count--)

*d8++ = *s8++;

return dest;

}

上述**對memcpy()進行了小優化使其在拷貝大記憶體的時候速度更快。但是若是dest和src的記憶體位址並沒有對齊,與此同時我們剛好要拷貝的記憶體又相當的大,是不是就沒有辦法只能按位元組慢慢拷貝了呢,答案當然不是。

我們來看glibc原始碼中是怎麼實現這個函式的:string/memcpy.c

void *

memcpy (void *dstpp, const void *srcpp, size_t len)

/* 若len怎麼樣平時不起眼的memcpy也是內藏乾坤,最好的學習方法應該就是linus大神說的rtfsc。

關於memcpy函式

一朋友問我memcpy如何寫?初時感到愕然,c庫中不是有嗎?後來才知道原來是某公司考題。檢視了一下要求,呵呵,要求的已經不是原來的memcpy函式了。嘗試寫出,歡迎高手拍磚 define n 4 pragma pack n void memcpyy void dest,const void src,...

memcpy函式的實現

前段時間去面試自己比較喜歡的乙個工作,面試的哥們讓我實現void memcpy void to,const void from,size t count 這個函式。沒做出來,掛了。感到非常不爽。回來研究了一下。找著了幾個不同版的實現,貼出來。首先對這個函式做一些說明。include void mem...

程式設計實現memcpy()

以下內容 面試中如問到memcpy的實現,那就要小心了,這裡有陷阱。先看下標準memcpy 的解釋 注意下面的注釋,對於位址重疊的情況,該函式的行為是未定義的。事實上所說的陷阱也在於此,自己動手實現memcpy 時就需要考慮位址重疊的情況。另外,標準庫也提供了位址重疊時的記憶體拷貝函式 memmov...