作者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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1611253677.A.6E1.html
1F:→ sarafciel: 多的那16byte是heap自己拿来做记忆体管理的 就这样 01/22 04:08
2F:推 LPH66: 另外可能还有所谓对齐 (alignment) 的问题 01/22 05:28
3F:推 chuegou: 32应该是对齐造成 01/22 09:11
4F:推 b0920075: 你可以研究一下ptmalloc的实作,allocator会用一个叫ch 01/22 11:57
5F:→ b0920075: unk的结构管理分发回收记忆体,allocated chunk header 01/22 11:57
6F:→ b0920075: 第一个栏位是previous chunk size ,再来是该chunk 的 01/22 11:57
7F:→ b0920075: size,再来才是你要放的data,所以会再差16bytes 01/22 11:57
8F:→ b0920075: 至於其他allocator是不是这样就要再去看code,上面仅限 01/22 11:58
9F:→ b0920075: 於glibc的ptmalloc 01/22 11:58
10F:→ loveme00835: 虽然说语言层最好还是不要对 malloc() 回传值有什麽 01/22 13:46
11F:→ loveme00835: 假设啦. 你用 _Alignof(list) 算出来如果比 16 小就 01/22 13:47
12F:→ loveme00835: 不会是 alignment 造成这个问题啦, 一楼四楼讲得比较 01/22 13:47
13F:→ loveme00835: 有可能 01/22 13:47
14F:推 dces4212: metadata? 01/23 04:16
15F:→ oToToT: 也不是每个人都只想处理语言层吧 01/24 01:51
16F:→ onlySN: 不只想处理语言层 那本来就不该用malloc做阿 02/03 09:04
17F:推 kingofsdtw: 未看先猜sizeof(int) 02/05 01:19