STL空间配置器的union obj
来源:互联网 发布:java怎么配置环境变量 编辑:程序博客网 时间:2024/05/18 18:54
最近学习《STL源码剖析》一书,看到SGI的第二级配置器时,空闲内存链表使用了一个神奇的联合体(union)结构,代码如下:union obj{ union obj * free_list_link; char client_data[1]; /* The client sees this.*/};书中描述为这样:由于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的首地址,亦即实际区块的地址。再看看下面一个栗子:// 下面这段代码中的两个输出值完全一样obj * block = (obj *) malloc(128);printf("%x\n", block);printf("%x\n", block->client_data);// 然后再将它串接到free_list中去block->free_list_link = free_list;free_list = block;// 使用时将其取出,指向下一个区块的free_list_link此时就被我们当做空闲区域来使用了,因而不会额外占用空间obj *myBlock = free_list;free_list = free_list->free_list_link;// 之后直接使用myBlock->client_data来访问该内存区域// ..............// ..............试验我们会发现client_data和myBlock的地址完全相同,那么问题来了:既然它们值是一样的,作者为什么还要画蛇添足的为obj增加client_data这个成员呢?我比较同意的一种观点是:这里client_data其实是作为一种指针类型转换,为了方便使用。一般内存buffer我们都是使用char*指针,如果要使用obj的地址,还得加上 (char *)myBlock 进行强制类型转换。反之直接使用myBlock->client_data即可,方便多了。
1 0
- STL空间配置器的union obj
- STL空间配置器的union obj
- STL源码剖析配置器中的union obj
- STL的空间配置器
- 【STL】STL空间配置器
- STL学习笔记之union obj
- STL空间配置器
- STL空间配置器
- STL空间配置器
- 【STL】空间配置器
- STL空间配置器
- STL----空间配置器
- STL-空间配置器
- STL空间配置器
- STL空间配置器
- STL空间配置器
- STL空间配置器
- STL-空间配置器
- 字符串反转 转换大小写的三种方法
- Android之在window下面开发常用的adb命令(不断更新)
- SVN提交之后补写或改写log信息的方法及错误问题解决
- Hive2 beeline 使用方法
- Mac环境Sublime text2解决中文乱码的问题
- STL空间配置器的union obj
- C++:文件加密(凯撒加密、栅栏加密、异或加密四方加密、Base64加密)
- Struts2源码深入
- USB协通讯议--深入理解
- Android开发如何进阶?(转载)
- 算法学习与代码实现6——快速排序
- 自定义侧拉删除(嵌套ListView)
- 2016年Android实习岗位 腾讯二面+阿里一面
- 简略版ubuntu14.04下安装caffe所遇到的问题解决