STL源码剖析配置器中的union obj

        最近看了《STL源码剖析》一书的一些章节,当看到第二章空间配置器时有些傻眼。特别是在union obj上。

union obj {
     union obj *free_list_link;
     char client_data[1];
};


       这个地方对于client_data[1]的理解让人费神。

       后来在网上看了一些解释后才明白了些。 当我们只看char client_data[1] 这个数组时,我们知道数组中只有一个元素,占用字节为1字节;而client_data则是指向这个数组的首地址,现在将其看为一个普通的指针,指向此数组的首地址。将其放入union obj中时,union obj占用总字节数为4字节(32位系统),其中第一个字节也可以存放数组client_data中的元素,此时,client_data依然指向此数组的首地址,而它的首地址即是这个union obj的首地址。因此,书上说,从其第二字段观之,obj可被视为一个指针,指向实际区块。


今天参加笔试被虐后,才发现这个union的妙处。由于内存池的空间没有分配时,里面是不用存放其他数据的,因此将它来指向下一个block的开始,而当它被分配后,那么它就不用指向某个block了,直接用它来存放数据。这样就可以实现两用了,核心原因是obj中的指针和首地址不会同时用到。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值