SGI的第二级配置器共存在16种free-list,各自管理的大小分别为8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128bytes的小额区块。
链表free-list的结点结构如下:
union obi{
union object* free_list_link;
char client_data[1]; //1是举例值,可以为8,16,...,128
};
侯捷先生在书中提到该结点具有一物两用的特性,下面是详细解释:
由类型”union”可知指针free_list_link和数组client_data共享一段大小为sizeof(union obj)=4的内存空间。当指针free_list_link指向下一个节点时,client[0]内存储的内容为下一个节点的前一个字节大小的地址(实际上,现在数组client_data并没有使用到)。但当客端需要使用小额区块,即使用client_data数组的时候,free_list_link内存储的下一个节点的地址数据将被覆盖掉,故而free-list也就不再指向他们。
这时就实现了一物两用的目的。