作者gowrite (gowrite)
看板C_and_CPP
標題[問題] malloc 記憶體長度的問題
時間Fri Jan 22 02:27:55 2021
開發平台(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
→ sarafciel: 多的那16byte是heap自己拿來做記憶體管理的 就這樣 01/22 04:08
推 LPH66: 另外可能還有所謂對齊 (alignment) 的問題 01/22 05:28
推 chuegou: 32應該是對齊造成 01/22 09:11
推 b0920075: 你可以研究一下ptmalloc的實作,allocator會用一個叫ch 01/22 11:57
→ b0920075: unk的結構管理分發回收記憶體,allocated chunk header 01/22 11:57
→ b0920075: 第一個欄位是previous chunk size ,再來是該chunk 的 01/22 11:57
→ b0920075: size,再來才是你要放的data,所以會再差16bytes 01/22 11:57
→ b0920075: 至於其他allocator是不是這樣就要再去看code,上面僅限 01/22 11:58
→ b0920075: 於glibc的ptmalloc 01/22 11:58
→ loveme00835: 雖然說語言層最好還是不要對 malloc() 回傳值有什麼 01/22 13:46
→ loveme00835: 假設啦. 你用 _Alignof(list) 算出來如果比 16 小就 01/22 13:47
→ loveme00835: 不會是 alignment 造成這個問題啦, 一樓四樓講得比較 01/22 13:47
→ loveme00835: 有可能 01/22 13:47
推 dces4212: metadata? 01/23 04:16
→ oToToT: 也不是每個人都只想處理語言層吧 01/24 01:51
→ onlySN: 不只想處理語言層 那本來就不該用malloc做阿 02/03 09:04
推 kingofsdtw: 未看先猜sizeof(int) 02/05 01:19