在看STL内存管理时看到一个很不起眼的数据结构,因为以前没有见到过类似的用法,本着STL中没有废物的原则,因此很好奇,结果一查不得了,原来这个使用方法那么精妙。
union _Obj {
union _Obj* _M_free_list_link;
char _M_client_data[1]; /* The client sees this. */
};
代码中是一个公用体,首个是指向自己本身类型 union _Obj* _M_free_list_link;
的指针,第二个 char _M_client_data[1];
经常写C/C++也肯定知道,也相当于一个指针,用来引用数据,那么为什么放两个指针在一个公用体里面?
通过下图我们可以看到实际使用的妙用:
图中的free-list使用的结构体就是 _Obj,白色的条为已经分配给客户端,那么这些已经分配的使用 _M_client_data
字段,因此客户端能够直接使用到首个字节。当这些内存空闲时使用 _M_free_list_link
链表将其串起来。这样使用之后能将内存压榨到极致。