更新时间:2023-02-12 11:53:54
谢邀
这句话是正确的:它不需要一个指针来特意指向真正分配给用户的内存, 而是直接在这个union中分配
一个***链表(free_list)
在同一时刻,具备且仅具备如下功能之一:
1、作为一个***链表指针,指向下一个***链表
2、自身作为一块可用内存,供用户使用
由于如上用途不可能同时出现,故将obj
定义为union
,将free_list_link
和client_data
共享同一块内存来节省内存。
这句话是错误的:除了最后一个union其实是一个指针用来指向下一个方块的, 其它的其实都是用来直接分配给用户的
注意,这是链表,链表在内存中的分布是杂乱而不连续的,并非你所示的连续一段区域。
上文说道,一个obj
结构,要不作为一块已被分配内存供用户使用,要不作为待分配区域存在于***链表中。所以,***链表中的每个块,都是指向下一个***链表块,即理解为:
struct node{
node *next;
};
一旦这个***链表块被分配给用户了,那么它就从***链表中被移除了,不再被认为是一个***链表块(由union
的语义,从此它就是一块普通的,分配给用户的内存,直到被用户释放,它才会被再次加入***链表中)
这句话并不妥当:其实用结构体也可以达到相同的效果啊
一旦内存分配完了,这块内存(即***链表块)的指针就会被malloc()/new
返回给用户,接下来保存指针的任务就交给用户了,我干嘛还在内存配置器里留着这货,多保存个指针不又把空间浪费掉了么。只有未分配的内存才能存在于***链表中!
另,推荐侯捷翻译的《STL源码剖析》