个人技术分享

在看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链表将其串起来。这样使用之后能将内存压榨到极致。