日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

malloc 源码

發布時間:2024/4/18 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 malloc 源码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 兩個函數取自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:?/*?---------------------------???????*/?
  • 總結

    以上是生活随笔為你收集整理的malloc 源码的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。