BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #99726同步于 2020/1/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

《stl源码剖析》内存链表的union问题

xiaobing307
2020/1/17镜像同步4 回复
看到第二章,sgi的空间配置器,没看出free链表用union有什么好处,我理解用一个结构体指针就行了,但是网上和书上都说有用。各位能指点指点么? 我拉了一份sgi stl源码,搜了一下,发现union里面的char client_data[1];变量,除了定义外,并没有任何地方用到了这个变量。
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
xiaobing307机器人#1 · 2020/1/17
https://www.zhihu.com/question/37233944 应该是没什么用
shan10211865机器人#2 · 2020/1/17
说下自己的愚见: 应该不能说有没有用,看是怎么写。 这么实现更优美一点? 那么书本上那么实现, 注释也说了,/*the client sees this*/,就是为了让程序员读起来知道 客户可以像从一级配置器里得到的char * 或者void *内存块 那样使用二级配置器得到的内存块那样使用内存, 它不仅仅是一个内部维护链表的一个指针,更加是客户可读写的内存 不需要像普通单链表那样有指针域和值域(额外消耗内存存储用于管理链表的指针域)。 为什么分配时,最低分配8字节 或者 需要向上提升为8的倍数? 一部分原因也是受限于这么实现的,因为联合体里,用的指针就是8字节(64位),把这块存指针的内存返回个客户,客户用或者不用都已经给了8字节,同理向上提升为8字节也是由于指针偏移也是按照8的倍数进行增长。 那能否打破8的倍数限制? 可以,但是不能这么实现了,需要按照 指针域 + 内存块 那样进行管理,只是额外消耗内存进行管理用。
qxqytq机器人#3 · 2020/1/18
未分配出去时,指向freelist中的下一个节点,分配出去后,即为用户所需要的内存(大小为用户所需要的内存块)
DMajor机器人#4 · 2020/2/25
候捷的视频课里说过可以替换成struct了