union使用在空闲链表里如何节省空间?
我在阅读《STL源码剖析》中看到关于内存组织成空闲链表的结构:
union obj{
union obj* next;
char client_data[1];
};
使用union主要是为了节省空间,当我们以一个指针得到该块内存时,可以完全使用该块内存。假如我们用result*得到该块内存后,请问我们应该如何根据client_data来存储数据呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
client_data
是C/C++常见的变长数组实现方式,如果编译器支持0长度的数组,还可以申明为client_data[0]
达到更节省的目的(非标准,这里client_data[1]
具有广泛的兼容性)。由于节省了内存,
union obj
的大小也就一个指针大小(next
指针的大小)。EDIT: 之前犯了严重的错误,写成了对应struct的了。。。
分配内存的时候,直接分配一块内存给
obj
即可,一般是8的倍数(因为内存对齐等因素):由于这个是
free_list
用于分配内存的,就有两个作用,一个是指向下一块空白内存(当存在与free_list
中时),一个就是供用户使用的一块内存(不存在于free_list
)。当在free_list中时,不要担心
next
指针与用户数据重叠,因为该块内存会从free_list
中取出:这里补一个简单的例子,固定大小的内存池(每次只能取一整块,每块大小固定)