SGI STL空间适配器freelist设计

今天重新看了《STL源代码剖析》,不禁要赞叹STL设计的经典。STL 的空间适配代码设计的尤为精辟,不仅考虑到内存碎片的隐患,而且考虑到指针空间的节俭和复用,降低维护链表(lists)带来额外的负担。我们来看看如下代码;

先看看STL的结构体,

union obj{
    union obj *free_list_link;
    char clent_data[1];  /* the client sees this */
};

obj 之所以用union,由于union之故,从其第一个字段观之,obj可被视为一个指针,指向相同形式的另一个obj。从其第二个字段观之,obj可被视为一个指针,指向实际区域。一物二用的结果是,不会为了维护链表所必须的指针而造成内存的另一种让费。

看看如下示例代码,你就发现它的设计精妙之处!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
using namespace std;

union obj{
    union obj *free_list_link;
    char clent_data[1];  /* the client sees this */
};

int main()
{
    obj *op1 = (obj *)malloc(32);
    strcpy(op1->clent_data,"hello free!");

    obj *op2 = (obj *)malloc(32);
    op2->free_list_link = NULL;

    obj *op3 = (obj *)malloc(32);
    strcpy(op3->clent_data,"hello free l");

    printf("----------------------------------------\r\n");

    printf("address freelist:%ld\r\n",(long)(op3->free_list_link));
    printf("address clentdata:%ld\r\n",(long)&(op3->clent_data));

    obj *op4 = (obj *)malloc(32);
    op4->free_list_link = op2;

    obj *op5 = (obj *)malloc(32);
    op5->free_list_link = op4;

    printf("----------------------------------------\r\n");
    obj *begin = op5;
    while(begin){
        printf("%ld\r\n",(long)begin);
        begin = begin->free_list_link;
    }

    /* release op3 */
    op2->free_list_link = op3;
    op3->free_list_link = NULL;

    printf("----------------------------------------\r\n");

    printf("address freelist:%ld\r\n",(long)(op3->free_list_link));
    printf("address clentdata:%ld\r\n",(long)&(op3->clent_data));

    printf("----------------------------------------\r\n");
    begin = op5;
    while(begin){
        printf("begin:%ld\r\n",(long)begin);
        begin = begin->free_list_link;
    }

    return 0;
}

输出如下:

----------------------------------------
address freelist:1819043176
address clentdata:143143000
----------------------------------------
143143080
143143040
143142960
----------------------------------------
address freelist:0
address clentdata:143143000
----------------------------------------
begin:143143080
begin:143143040
begin:143142960
begin:143143000

时间: 2024-12-22 21:18:46

SGI STL空间适配器freelist设计的相关文章

STL——空间的配置和释放std::alloc(第一级配置器和第二级配置器)

1 空间的配置和释放,std::alloc 对象构造前的空间配置和对象析构后的空间释放,由<stl_alloc.h>负责,SGI对此的设计哲学如下: 向system heap要求空间 考虑多线程状态 考虑内存不足时的应变措施 考虑过多"小型区块"可能造成的内存碎片问题 C++的内存配置基本操作是::operator new(),内存释放基本操作是::operator delete().这两个全局函数相当于C的malloc()和free()函数.是的,正是如此,SGI正是以m

sgi- 今天看SGI STL源码剖析空间配置器部分,有一个疑问,求解 .

问题描述 今天看SGI STL源码剖析空间配置器部分,有一个疑问,求解 . 今天看SGI STL源码剖析空间配置器部分,有一个疑问,求解. 具体问题是: SGI STL的第二级空间配置器分配完空间之后,不回收给系统吗?(每次都添加都内存池free list) 没看到相关释放内存池的代码. 求解释.

gcc-请问SGI STL的源码slist_node派生的问题

问题描述 请问SGI STL的源码slist_node派生的问题 请问SGI STL的源码中,为何要slist_node_base派生slist_node,而不是一步到位slist_node?请GCC的大侠们来回答小弟,不胜感激! 解决方案 这样你可以基于它再继承生成自己的node吧

基于MapReduce的空间敏感性分析并行算法设计

基于MapReduce的空间敏感性分析并行算法设计 李帆 何洪林 任小丽 张黎 路倩倩 于贵瑞 近年来,随着遥感空间数据广泛应用于生态系统,推动了区域尺度生态遥感参数模型的发展.敏感性分析对识别模型关键参数,降低模型不确定性和完善模型具有重要作用.区域尺度的生态遥感参数模型,在进行模型参数敏感性分析时,由于涉及到空间数据的复杂运算,单机环境无法满足快速分析的要求.为了提高生态遥感参数模型空间敏感性分析效率,本文以青藏高原为研究区域,利用植被光合模型VPM(Vegetation Photosynt

卡萨帝冰箱“大空间”设计受用户称赞

哲学上说"物质决定意识",古人说"仓廪实而知礼节,衣食足而知荣辱",随着物质生活水平的提高,人们对日常生活中的用品要求也会随之提高,尤其是在房屋和家电方面.对于家电,人们不光要求功能全面,更要求外观时尚美观大方,卡萨帝的获"红点奖"冰箱一经展出就引起了很多人的关注.近日,在卡萨帝发起的"测测你是否有大师的眼光--卡萨帝冰箱获五项红点大奖"网页活动中,家住沈阳的林先生做出了如下评论:"卡萨帝本身就是一个创艺品牌,但是这

基于C语言的内存池的设计与实现

介绍:        设计内存池的目标是为了保证服务器长时间高效的运行,通过对申请空间小而申请频繁的对象进行有效管理,减少内存碎片的产生,合理分配管理用户内存,从而减少系统中出现有效空间足够,而无法分配大块连续内存的情况. 目标:     此次设计内存池的基本目标,需要满足线程安全性(多线程),适量的内存泄露越界检查,运行效率不太低于malloc/free方式,实现对4-128字节范围内的内存空间申请的内存池管理(非单一固定大小对象管理的内存池). 内存池技术设计与实现     本内存池的设计方

详细解说STL hash_map系列 〔转载〕

详细解说STL hash_map系列 0 为什么需要hash_map 1 数据结构:hash_map原理 2 hash_map 使用 2.1 一个简单实例 2.2 hash_map 的hash函数 2.3 hash_map 的比较函数 2.4 hash_map 函数 3 相关hash容器 4 其他 4.1 hash_map和map的区别在哪里? 4.2 什么时候需要用hash_map,什么时候需要用map? 4.3 如何在hash_map中加入自己定义的类型? 4.4如何用hash_map替换程

C++ STL编程轻松入门

  作为C++标准不可缺少的一部分,STL应该是渗透在C++程序的角角落落里的.STL不是实验室里的宠儿,也不是程序员桌上的摆设,她的激动人心并非昙花一现.本教程旨在传播和普及STL的基础知识,若能借此机会为STL的推广做些力所能及的事情,到也是件让人愉快的事情. 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL科学领域里所常用的基本数据结构和基本算法.为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性.这种现象有些类似于Microsoft Visual

STL 的string类怎么啦_C 语言

STL 的string类怎么啦?陈皓 前言 上个周末在和我的同学爬香山闲聊时,同学说到STL中的string类曾经让他备受折磨,几年前他开发一个系统前对string类还比较清楚,然后随着程序的复杂度的加深,到了后期,他几乎对string类失去了信心和信任,他觉得他对string类一头雾水.老实说,我几年前也有同样的痛苦(就是当我写下<标准C++类string的Copy-On-Write技术>之前的一段时间).那时,我不得不研究那根本不是给人看的SGI出品的string类的源码,代码的可读性几乎