STL学习笔记之union obj

最近看STL源码剖析时遇到了一个有趣union的用法,简单谈谈自己的看法
STL第二级空间配置器中,自由链表的节点结构如下:
union obj{
union obj * free_list_link;
char client_data[1];
};
书上给的解释是这样的:“上述obj所用用的是union,由于union之故,从其第一字段观之,obj可被视为—个指针,指向相同形式的另一个obj。从其第二字段观之,obj可被视为一个指针,指向实际区块。一物二用的结果是,不会为了维
护链表所必须的指针而造成内存的另一种浪费。”
第一句话很好理解,在此就不再赘述,本文将探讨的重点放在第二句话,即其为何指向实际区块。
现在看下面一段代码的运行结果

如图所示,指针p所存的地址为0x008ff7a0即为数组m1首元素地址,同时data首元素地址与数组m首元素地址相同。
对此,我的理解是:此时test = (union obj*)m;使得test指向数组m所在空间,则data[0]所占空间为m[0]所占空间,于是data所指空间即为m所指空间。

由上述可知在第二级空间配置器中,自由链表某节点client_data所指地址即为该区块首地址。

 

补充:

书中描述为这样:由于union之故,从其第一字段观之,obj可被视为一个指针,指向相同形式的另一个obj。从其第二字段观之,obj可被视为一个指针,指向实际区块。union的特性就是其内存空间为其成员中最长长度的整数倍,而且可作为成员中的任意一种类型来使用,他们共用同一块内存空间。该联合体第一个字段是指向下一个union obj的指针,按32位地址空间算,其长度应该为4byte。第二个字段是长度为1的一个数组,也就是1byte;看到这里我就无法理解了,长度为一的数组有什么意义呢?看看下面的栗子:


char client_data;    /*此处的client_data是一个char型变量*/
char client_data[1]; /*而此处client_data是一个数组的首地址*/


他们的区别如上所示,这样就好理解了,事实上我们所关注的并不是client_data[1]里面的内容,而是client_data这个数组首地址。由于client_data[1]和free_list_link使用的是同一块内存区域。
由于free_list_link长度较大,union obj的长度为它的整数倍,client_data[1]只占了其头部的一个字节。因此client_data首地址指向的也就是整个union obj的首地址,亦即实际区块的地址。
--------------------- 
作者:yaotouge 
来源:CSDN 
原文:https://blog.csdn.net/w450468524/article/details/51649222 
版权声明:本文为博主原创文章,转载请附上博文链接!
--------------------- 
作者:hx_lFeng 
来源:CSDN 
原文:https://blog.csdn.net/hx_lfeng/article/details/78163361 
版权声明:本文为博主原创文章,转载请附上博文链接!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值