malloc 源码
来源:互联网 发布:java如何获取访问者ip 编辑:程序博客网 时间:2024/05/02 04:52
- 两个函数取自UNIX 版本6 malloc.c文件,一个为malloc函数,一个为mfree函数
- 2515:/*map数组是一个空闲资源列表,其中每个存储区由其长度和相对地址定义*/
- struct map
- 2516: {
- 2517: char *m_size;
- 2518: char *m_addr;
- 2519: };
- 2520: /* --------------------------- */
- 2521:
- 2522: /*
- 2523: * Allocate size units from the given
- 2524: * map. Return the base of the allocated
- 2525: * space.
- 2526: * Algorithm is first fit.
- 2527: */
- 2528: malloc(mp, size)
- 2529: struct map *mp;
- 2530: {
- 2531: register int a;
- 2532: register struct map *bp;
- 2533:
- 2534: for (bp = mp; bp->m_size; bp++) { /*搜索map数组,直到到达map列表尾部,或者搜索到一个长度满足请求的空闲空间*/
- 2535: if (bp->m_size >= size) { /*该空闲块满足请求*/
- 2536: a = bp->m_addr; /*记录该区首地址*/
- 2537: bp->m_addr =+ size; /*空闲块地址首端大小为size块被分配,因此首地址前移size*/
- 2538: if ((bp->m_size =- size) == 0) /*分配的空闲块大小刚好等于请求空间的大小*/
- 2539: do { /*将该空间块在map中的后继记录前移*/
- 2540: bp++;
- 2541: (bp-1)->m_addr = bp->m_addr;
- 2542: } while ((bp-1)->m_size = bp->m_size);
- 2543: return(a);
- 2544: }
- 2545: }
- 2546: return(0);
- 2547: }
- 2548: /* --------------------------- */
- 2549:
- 2550: /*
- 2551: * Free the previously allocated space aa
- 2552: * of size units into the specified map.
- 2553: * Sort aa into map and combine on
- 2554: * one or both ends if possible.
- 2555: */
- /*将一个大小为size,起始地址为aa的存储区还给map*/
- 2556: mfree(mp, size, aa)
- 2557: struct map *mp;
- 2558: {
- 2559: register struct map *bp;
- 2560: register int t;
- 2561: register int a;
- 2562:
- 2563: a = aa;
- 2564: for (bp = mp; bp->m_addr<=a && bp->m_size!=0; bp++); /*搜索map,直到找到map中起始地址小于释放空间地址的记录*/
- 2565: if (bp>mp && (bp-1)->m_addr+(bp-1)->m_size == a) { /*释放空间和前一空间连续*/
- 2566: (bp-1)->m_size =+ size; /*map中前一元素的大小增加被释放空间的大小*/
- 2567: if (a+size == bp->m_addr) { /*释放的存储区是否与map中下一个区块相邻*/
- 2568: (bp-1)->m_size =+ bp->m_size; /*合并被释放块和后一块存储区*/
- 2569: while (bp->m_size) { /*前移余下的存储区*/
- 2570: bp++;
- 2571: (bp-1)->m_addr = bp->m_addr;
- 2572: (bp-1)->m_size = bp->m_size;
- 2573: }
- 2574: }
- 2575: } else { /*不与前一空间连续*/
- 2576: if (a+size == bp->m_addr && bp->m_size) { /*是否与后一空间连续*/
- 2577: bp->m_addr =- size;
- 2578: bp->m_size =+ size;
- 2579: } else if (size) do { /*释放空间大小不为0,在map中加入新记录,后移map中余下的空间记录*/
- 2580: t = bp->m_addr;
- 2581: bp->m_addr = a;
- 2582: a = t;
- 2583: t = bp->m_size;
- 2584: bp->m_size = size;
- 2585: bp++;
- 2586: } while (size = t);
- 2587: }
- 2588: }
- 2589: /* --------------------------- */
0 0
- malloc 源码
- malloc源码
- malloc 源码
- malloc源码
- malloc 源码
- malloc源码剖析
- malloc实现源码
- malloc/free实现 源码
- malloc源码分析---1
- malloc源码分析---2
- malloc源码分析---3
- malloc源码分析---4
- malloc源码分析---5
- dlmalloc源码剖析之:mALLOc
- malloc的源码剖析源
- doug lea malloc源码剖析之:malloc_consolidate
- doug lea malloc源码剖析之:sYSMALLOc
- linux 0.11内核源码 malloc 的实现
- iOS开发new与alloc/init的区别
- Android学习笔记--文件的读写
- XMPP中离线消息的发送
- 各种Layout用到的一些重要的属性
- VC中的隐式转换 一般是隐藏的错误
- malloc 源码
- gdb显示汇编调试
- os日期格式转换
- 谁说3D打印只能做模型?这项新技术搞定了量产
- 野指针理解和处理
- 获取WebView里的网页文本内容
- 递归递归删除子目录下所有.o后缀文件
- 谁说3D打印只能做模型?这项新技术搞定了量产
- iOS OC和Javascript互相调用