C++中“記憶體重疊”
最近在複習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),會造成記憶體重疊,此時需要從右到左進行記憶體拷貝。其他情況按從左到右進行記憶體拷貝即可。
相關文章
- 記憶體堆疊記憶體
- JS中堆疊記憶體的練習JS記憶體
- project中的堆疊記憶體,記憶體地址引用,gc相關問題Project記憶體GC
- Java 堆疊記憶體分配Java記憶體
- [C++]記憶體分配C++記憶體
- C++記憶體管理C++記憶體
- C++ 繼承中的記憶體佈局C++繼承記憶體
- windows核心程式設計--記憶體堆疊Windows程式設計記憶體
- javascript堆疊記憶體分配的區別JavaScript記憶體
- C++記憶體管理剖析C++記憶體
- C++ 記憶體對齊C++記憶體
- c++ 記憶體 繼承C++記憶體繼承
- C++記憶體管理:簡易記憶體池的實現C++記憶體
- 堆疊和記憶體的關係 細說記憶體
- C++手寫記憶體池C++記憶體
- 控制C++的記憶體分配C++記憶體
- C++ 動態記憶體分配C++記憶體
- 轉載——C++記憶體管理C++記憶體
- C++動態記憶體分配C++記憶體
- JS中的棧記憶體、堆記憶體JS記憶體
- C++中的動態記憶體與智慧指標C++記憶體指標
- C++學習體會:記憶體管理C++記憶體
- JAVA的堆疊和記憶體、垃圾回收解說Java記憶體
- GUN C++ STL中的vector的記憶體分配器C++記憶體
- c++記憶體中位元組對齊問題詳解C++記憶體
- C++ 物件的記憶體佈局C++物件記憶體
- C++ struct結構體記憶體對齊C++Struct結構體記憶體
- 【C++】C++ 記憶體分配(new,operator new)詳解C++記憶體
- C/C++浮點數在記憶體中的儲存方式C++記憶體
- C++動態記憶體管理——new/deleteC++記憶體delete
- C/C++記憶體對齊詳解C++記憶體
- C/C++記憶體分配以及釋放C++記憶體
- C++記憶體管理:new / delete 和 cookieC++記憶體deleteCookie
- C/C++記憶體對齊原則C++記憶體
- C++六種記憶體序詳解C++記憶體
- C++原子操作與記憶體序 1C++記憶體
- Java記憶體模型FAQ(二) 其他語言,像C++,也有記憶體模型嗎?Java記憶體模型C++
- 【重溫基礎】22.記憶體管理記憶體