[問題] malloc 記憶體長度的問題

看板C_and_CPP (C/C++)作者 (gowrite)時間4年前 (2021/01/22 02:27), 編輯推噓4(4011)
留言15則, 7人參與, 4年前最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Linux Ubuntu 20 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) GCC 9.3 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) N/A 問題(Question): 我定義了一個 struct typedef struct __list{ int data; struct __list *next; }list; 可以知道上面的 struct __list 所佔的空間是 16 byte 然後我產生了 3 個 node,每一個 linked list node 的資訊如下 第一個 node addr: 0x5650c11176b0 , data : 2 第二個 node addr: 0x5650c11176d0 , data : 3 第三個 node addr: 0x5650c11176f0 , data : 1 我的問題是: 第一個 node 位置是 0xb0,第二個 node 的位置是 0xd0 每個 node 長度為 16 byte, 為什麼第二個 node 距離第一個 node 的位置,為什麼不是 0xc0,差 16 byte, 而是差 32 byte 雖然 malloc 的 linked list 就是不連續的記憶體空間, 所以不能預期每個 node 會連在一起 但是又為什麼每個 node 都剛剛好差距 32 byte 有前輩可以解說一下嗎? 謝謝 餵入的資料(Input): 如上 預期的正確結果(Expected Output): 記憶體空間差距的疑問 錯誤結果(Wrong Output): N/A 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) 程式碼如上 補充說明(Supplement): N/A -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.174.9.33 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1611253677.A.6E1.html

01/22 04:08, 4年前 , 1F
多的那16byte是heap自己拿來做記憶體管理的 就這樣
01/22 04:08, 1F

01/22 05:28, 4年前 , 2F
另外可能還有所謂對齊 (alignment) 的問題
01/22 05:28, 2F

01/22 09:11, 4年前 , 3F
32應該是對齊造成
01/22 09:11, 3F

01/22 11:57, 4年前 , 4F
你可以研究一下ptmalloc的實作,allocator會用一個叫ch
01/22 11:57, 4F

01/22 11:57, 4年前 , 5F
unk的結構管理分發回收記憶體,allocated chunk header
01/22 11:57, 5F

01/22 11:57, 4年前 , 6F
第一個欄位是previous chunk size ,再來是該chunk 的
01/22 11:57, 6F

01/22 11:57, 4年前 , 7F
size,再來才是你要放的data,所以會再差16bytes
01/22 11:57, 7F

01/22 11:58, 4年前 , 8F
至於其他allocator是不是這樣就要再去看code,上面僅限
01/22 11:58, 8F

01/22 11:58, 4年前 , 9F
於glibc的ptmalloc
01/22 11:58, 9F

01/22 13:46, 4年前 , 10F
雖然說語言層最好還是不要對 malloc() 回傳值有什麼
01/22 13:46, 10F

01/22 13:47, 4年前 , 11F
假設啦. 你用 _Alignof(list) 算出來如果比 16 小就
01/22 13:47, 11F

01/22 13:47, 4年前 , 12F
不會是 alignment 造成這個問題啦, 一樓四樓講得比較
01/22 13:47, 12F

01/22 13:47, 4年前 , 13F
有可能
01/22 13:47, 13F

01/23 04:16, 4年前 , 14F
metadata?
01/23 04:16, 14F

01/24 01:51, 4年前 , 15F
也不是每個人都只想處理語言層吧
01/24 01:51, 15F
文章代碼(AID): #1W2SUjRX (C_and_CPP)
文章代碼(AID): #1W2SUjRX (C_and_CPP)