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
- C++記憶體管理C++記憶體
- C++記憶體掃描C++記憶體
- C++記憶體管理剖析C++記憶體
- windows核心程式設計--記憶體堆疊Windows程式設計記憶體
- javascript堆疊記憶體分配的區別JavaScript記憶體
- C++記憶體管理:簡易記憶體池的實現C++記憶體
- C++動態記憶體分配C++記憶體
- C++手寫記憶體池C++記憶體
- 堆疊和記憶體的關係 細說記憶體
- JS中的棧記憶體、堆記憶體JS記憶體
- C++記憶體模型實踐探索C++記憶體模型
- C++ struct結構體記憶體對齊C++Struct結構體記憶體
- Java堆疊的深度分析及記憶體管理技巧Java記憶體
- 從C++看C#託管記憶體與非託管記憶體C++C#記憶體
- C++動態記憶體管理——new/deleteC++記憶體delete
- C++六種記憶體序詳解C++記憶體
- C++ 指標動態記憶體分配C++指標記憶體
- C++原子操作與記憶體序 1C++記憶體
- C/C++記憶體分配以及釋放C++記憶體
- C++記憶體管理:new / delete 和 cookieC++記憶體deleteCookie
- C/C++記憶體對齊原則C++記憶體
- C/C++記憶體對齊詳解C++記憶體
- Java記憶體模型FAQ(二) 其他語言,像C++,也有記憶體模型嗎?Java記憶體模型C++
- 什麼是Java記憶體模型(JMM)中的主記憶體和本地記憶體?Java記憶體模型
- 《深度探索c++記憶體模型》讀書筆記 (二)C++記憶體模型筆記
- 【重溫基礎】22.記憶體管理記憶體
- C++ 共享記憶體ShellCode跨程式傳輸C++記憶體
- C++ 虛繼承 物件記憶體佈局C++繼承物件記憶體
- 新提案:C++將變得記憶體安全C++記憶體
- 【C/C++】4.C++的記憶體管理C++記憶體
- c++之引用及記憶體分割槽模型C++記憶體模型
- Redis記憶體——記憶體消耗(記憶體都去哪了?)Redis記憶體
- go中的記憶體逃逸Go記憶體
- javascript中的記憶體管理JavaScript記憶體
- C/C++程式除錯和記憶體檢測C++除錯記憶體
- 請描述C/C++程式的記憶體分割槽?C++記憶體
- C++ vector 釋放記憶體的兩種方法C++記憶體