面試中面試官經常會讓寫程式,根據題目的難度會在演算法和程式設計習慣上各有側重。比如寫乙個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的位址空間最好不要重疊。如果要考慮...