C++中“記憶體重疊”

bian_qing_quan11發表於2017-07-31

最近在複習C++準備校招,看到有的面試題中讓寫出memcpy函式。剛開始看,我還覺得挺簡單的。但是經過仔細分析後發現裡面隱藏了一個知識點“記憶體重疊”,當然這個知識點也正是面試過程中面試官想要看到你是否注意到這個問題了。

接下來我就先簡單介紹下什麼是“記憶體重疊”?

當我們進行記憶體拷貝(memcpy函式)時,目標地址在原地址的範圍內就造成了記憶體重疊。

這麼說可能會比較抽象,下面我們藉助於memcpy函式通過一個例子說明。

memcpy(void *dest, void *src, size_t num)是將src指向的地址中的num=5個位元組拷貝到dest目標地址中。根據dest和src的關係,可以分為以下三類:

case1:目標地址與源地址沒有任何重疊(dest > src + 5或者dest < src - 5)


此時,可以直接從src開始從左到右拷貝5個位元組到dest中。





case2:src-5 < dest < src


此時也沒有影響,從左到做直接拷貝即可。





case3:目標地址dest位於原地址的記憶體範圍之內(src < dest < src + 5),這時出現了記憶體重疊


如果此時仍按照之前的方法,從左到右進行記憶體拷貝的話,原始記憶體中的資料會被覆蓋掉產生錯誤(紅色)。此時,應該從右到左進行拷貝。


綜上所述,如果目標記憶體位於源記憶體內部的話(src < dest < src + 5),會造成記憶體重疊,此時需要從右到左進行記憶體拷貝。其他情況按從左到右進行記憶體拷貝即可。


相關文章