且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

c++ - stl内存池中使用union节省空间的问题.

更新时间:2023-02-12 11:53:54

谢邀

这句话是正确的:它不需要一个指针来特意指向真正分配给用户的内存, 而是直接在这个union中分配

一个***链表(free_list)同一时刻,具备且仅具备如下功能之一:
1、作为一个***链表指针,指向下一个***链表
2、自身作为一块可用内存,供用户使用
由于如上用途不可能同时出现,故将obj定义为union,将free_list_linkclient_data共享同一块内存来节省内存。

这句话是错误的:除了最后一个union其实是一个指针用来指向下一个方块的, 其它的其实都是用来直接分配给用户的

注意,这是链表,链表在内存中的分布是杂乱而不连续的,并非你所示的连续一段区域。
上文说道,一个obj结构,要不作为一块已被分配内存供用户使用,要不作为待分配区域存在于***链表中。所以,***链表中的每个块,都是指向下一个***链表块,即理解为:

struct node{
    node *next;
};

一旦这个***链表块被分配给用户了,那么它就从***链表中被移除了,不再被认为是一个***链表块(由union的语义,从此它就是一块普通的,分配给用户的内存,直到被用户释放,它才会被再次加入***链表中)

这句话并不妥当:其实用结构体也可以达到相同的效果啊
一旦内存分配完了,这块内存(即***链表块)的指针就会被malloc()/new返回给用户,接下来保存指针的任务就交给用户了,我干嘛还在内存配置器里留着这货,多保存个指针不又把空间浪费掉了么。只有未分配的内存才能存在于***链表中!

另,推荐侯捷翻译的《STL源码剖析》