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

来源:互联网 发布:旺旺号是淘宝会员名吗 编辑:程序博客网 时间:2024/05/25 01:36

        最近看了《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 0
原创粉丝点击