面試 實現記憶體複製函式

2021-07-04 03:30:34 字數 2107 閱讀 8114

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

該題目的演算法如下

0.1[cpp]view plain

copy

void

memcpy(

void

*dst, 

void

*src, 

intcount)  

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

0.2[cpp]view plain

copy

void

memcpy(

void

*dst, 

void

*src, 

intcount)  

}  在32位系統中,可複製的最多記憶體是多少?型別會不會不夠用?

記憶體複製不應該修改原始記憶體吧。

因此,函式宣告修改如下

0.3[cpp]view plain

copy

void

memcpy(

void

*dst, 

const

void

*src, 

size_t

count)  

這樣就萬事大吉了嗎?

如果傳入了空指標呢?

接著修改吧

0.4[cpp]view plain

copy

void

memcpy(

void

*dst, 

const

void

*src, 

size_t

count)  

}  如果有這樣的陣列

char ina=;

進行如下呼叫

memcpy(&ina[1], &ina[0], 5);

會發生什麼情況?

由於原始資料和目的資料在空間上存在重疊,這樣導致複製過程中不可避免會對原始資料做修改。而這樣的修改在函式的宣告中是看不到的(const void *src)。如果降低要求,可以修改原始資料完成複製,那麼這樣的設計能實現麼?這裡有乙個版本可供

參考。但是這樣的實現使得函式的功能不明確,可以認為是一種異常情況。

因此0.5

[cpp]view plain

copy

void

memcpy(

void

*dst, 

const

void

*src, 

size_t

count)  

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

[cpp]view plain

copy

void

* memcpy(

void

*dst, 

const

void

*src, 

size_t

count)  

0.6因此最終版本為

[cpp]view plain

copy

void

* memcpy(

void

*dst, 

const

void

*src, 

size_t

count)  

return

dst;  

}  

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

這個題目在面試出現的次數太頻繁,能夠比較正確的寫出這個函式的能說明什麼呢?

1.缺乏專案經驗,對於面試因此複習的很到位。

2.有可能有豐富的專案經驗,在專案中也這麼做。

3.認為有較多專案經驗,但是沒有注意非功能性要求。等著杯具吧。

Delphi 的記憶體操作函式 5 複製記憶體

movememory copymemory 的功能是一模一樣的,都是複製記憶體,都是呼叫 move 過程 movememory copymemory 操作指標 move 操作實體.還要注意,它們的引數位置不一樣 舉例 var buf1,buf2 array 0.9 of ansichar begin...

Delphi 的記憶體操作函式 5 複製記憶體

movememory copymemory 的功能類似,都是複製記憶體,都是呼叫 move 過程 movememory copymemory 操作指標 move 操作實體.還要注意,它們的引數位置不一樣 varbuf1,buf2 array 0.9 of ansichar begin buf1 01...

記憶體拷貝函式的實現

記憶體拷貝函式的實現 1 實現memcpy,void memcpy void dst,const void src,size t len 需要考慮記憶體重疊的情況。注意 實際c庫中的memcpy是不考慮記憶體重疊這個問題的,也就是說使用memcpy時,dst和src的位址空間最好不要重疊。如果要考慮...