[问题] malloc 内存长度的问题

楼主: gowrite (gowrite)   2021-01-22 02:27:55
开发平台(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
作者: sarafciel (Cattuz)   2021-01-22 04:08:00
多的那16byte是heap自己拿来做内存管理的 就这样
作者: LPH66 (-6.2598534e+18f)   2021-01-22 05:28:00
另外可能还有所谓对齐 (alignment) 的问题
作者: chuegou (chuegou)   2021-01-22 09:11:00
32应该是对齐造成
作者: b0920075 (Void)   2021-01-22 11:57:00
你可以研究一下ptmalloc的实作,allocator会用一个叫chunk的结构管理分发回收内存,allocated chunk header第一个字段是previous chunk size ,再来是该chunk 的size,再来才是你要放的data,所以会再差16bytes至于其他allocator是不是这样就要再去看code,上面仅限于glibc的ptmalloc
作者: loveme00835 (发箍)   2021-01-22 13:46:00
虽然说语言层最好还是不要对 malloc() 回传值有什么假设啦. 你用 _Alignof(list) 算出来如果比 16 小就不会是 alignment 造成这个问题啦, 一楼四楼讲得比较有可能
作者: dces4212 (flawless)   2021-01-23 04:16:00
metadata?
作者: oToToT (屁孩)   2021-01-24 01:51:00
也不是每个人都只想处理语言层吧
作者: onlySN (Forza Milan)   2021-02-03 09:04:00
不只想处理语言层 那本来就不该用malloc做阿
作者: kingofsdtw (不能閒下來!!)   2021-02-05 01:19:00
未看先猜sizeof(int)

Links booklink

Contact Us: admin [ a t ] ucptt.com