内存链表union类型节省内存


我在阅读《STL源码剖析》中看到关于内存组织成空闲链表的结构:

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

使用union主要是为了节省空间,当我们以一个指针得到该块内存时,可以完全使用该块内存。假如我们用result*得到该块内存后,请问我们应该如何根据client_data来存储数据呢?


client_data是C/C++常见的变长数组实现方式,如果编译器支持0长度的数组,还可以申明为client_data[0]达到更节省的目的(非标准,这里client_data[1]具有广泛的兼容性)。

由于节省了内存,union obj的大小也就一个指针大小(next指针的大小)。

EDIT: 之前犯了严重的错误,写成了对应struct的了。。。

分配内存的时候,直接分配一块内存给obj即可,一般是8的倍数(因为内存对齐等因素):

obj * block = (obj *)malloc(128); // 分配一块128字节的内存
free_list_ptr->next = block; // 挂接到free_list上

由于这个是free_list用于分配内存的,就有两个作用,一个是指向下一块空白内存(当存在与free_list中时),一个就是供用户使用的一块内存(不存在于free_list)。

当在free_list中时,不要担心next指针与用户数据重叠,因为该块内存会从free_list中取出:

// detach
obj * block = free_list_ptr->next;
free_list_ptr->next = NULL;
// 使用这块内存(block, 128字节)

本质上就是暂时利用未用的内存来存放链表节点,等某块内存被取用了以后,自然也就不是空白内存,也就指针节点也就没有意义了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值