面試:實現記憶體複製函數

來源:互聯網
上載者:User

面試中面試官經常會讓寫程式,根據題目的難度會在演算法和編程習慣上各有側重。比如寫一個memcpy函數,這個題演算法簡單明確,因此重點考察編程習慣、工程思想。
該題目的演算法如下
0.1

void  memcpy(void *dst, void *src, int count){while(count--){*dst = *src;dst++;src++;}}

問題是void*不能直接累加 *dst = *src也是不對的。
0.2

void memcpy(void *dst, void *src, int count){unsigned char *pdst = (unsigned char *)dst;unsigned char *psrc = (unsigned char *)src;while(count--){*pdst = *psrc;pdst++;psrc++;}}

在32位系統中,可複製的最多記憶體是多少?類型會不會不夠用?
記憶體複製不應該修改原始記憶體吧。
因此,函式宣告修改如下
0.3

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

這樣就萬事大吉了嗎?
如果傳入了null 指標呢?
接著修改吧
0.4

void memcpy(void *dst, const void *src, size_t count){assert(dst != NULL);assert(src != NULL);unsigned char *pdst = (unsigned char *)dst;const unsigned char *psrc = (const unsigned char *)src;while(count--){*pdst = *psrc;pdst++;psrc++;}}

如果有這樣的數組
char ina[]={0,1,2,3,4,5,6,7,8,9,10,11};
進行如下調用
memcpy(&ina[1], &ina[0], 5);
會發生什麼情況?
由於未經處理資料和目的資料在空間上存在重疊,這樣導致複製過程中不可避免會對未經處理資料做修改。而這樣的修改在函數的聲明中是看不到的(const void *src)。如果降低要求,可以修改未經處理資料完成複製,那麼這樣的設計能實現嗎?這裡有一個版本可供參考。但是這樣的實現使得函數的功能不明確,可以認為是一種異常情況。
因此
0.5

void memcpy(void *dst, const void *src, size_t count){assert(dst != NULL);assert(src != NULL);unsigned char *pdst = (unsigned char *)dst;const unsigned char *psrc = (const unsigned char *)src;assert(!(psrc<=pdst && pdst<psrc+count));//判斷是否有重疊assert(!(pdst<=psrc && psrc<pdst+count));while(count--){*pdst = *psrc;pdst++;psrc++;}}

到這裡實現已經比較健壯了。有些人想要鏈式的調用函數,也就是複製完記憶體後,傳回值直接當做其他函數的參數。

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

0.6因此最終版本為

void* memcpy(void *dst, const void *src, size_t count){assert(dst != NULL);assert(src != NULL);unsigned char *pdst = (unsigned char *)dst;const unsigned char *psrc = (const unsigned char *)src;assert(!(psrc<=pdst && pdst<psrc+count));assert(!(pdst<=psrc && psrc<pdst+count));while(count--){*pdst = *psrc;pdst++;psrc++;}return dst;}

最後,有網友做了效能測試,結論顯示上面的實現達不到庫函數的效能。個人認為庫函數可能做了最佳化,例如使用mmx技術,使得一次複製一個位元組到一次複製多個位元組。

這個題目在面試出現的次數太頻繁,能夠比較正確的寫出這個函數的能說明什麼呢?
1.缺乏項目經驗,對於面試因此複習的很到位。
2.有可能有豐富的項目經驗,在項目中也這麼做。
3.認為有較多項目經驗,但是沒有注意非功能性要求。等著杯具吧。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.