lwbt的内存分配详解
生活随笔
收集整理的這篇文章主要介紹了
lwbt的内存分配详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?????? Lwbt的mem分配是通過一個大的字節數組memp_memory來派發的。在這個數組中規定了哪一段是屬于哪個類型的,這樣做的方法不是很科學,是通過規定各個類型結構的最大能用的個數來取的。Hci_pcb的個數就一個。memp_num數組中的元素就是每個類型的最大可用個數。而memp_sizes數組中的元素是每個類型的大小。memp_tab數組中的元素則是每個類型分配內存的第一個可用空間指針。 ? ???????Size(memp_memory[type])?=??memp_sizes[type]?* memp_num[type] <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> ?
首先來看下memp這個結構體的定義: struct memp { ? struct memp *next; }; 它只有一個指向下一個結構的指針。同時注意到memp_tab數組中的元素都是這個結構的指針。
?
在這個文條件中主要有3個函數:lwbt_memp_init;lwbt_memp_malloc;lwbt_memp_free。上面說過對個結構的內存分配都是從一個指定的數組中來分配的。?
下面看下lwbt_memp_init的實現,從整體上來說,這個函數是把各個結構在memp_memory中的首地址賦值給memp_tab中的各對應元素。對于限制數大于1的情況,還要將該類型的各個實例的地址串接起來。說起來比較難理解一些。下面用圖解的方式給出: ???????????????????? ?Memp_memory 上圖中顯現的是以hci_link的初始化作為實例,其中預分配的數目為4個。 ? ?????? 我們從圖中看到了有鏈表的實現,但是在lwbt_memp_init中沒有明顯的字樣提及到鏈表的。這個功能,這里暫且稱為隱式鏈表。它的實現,是通過在分配多個連續塊內存的時候,在每一塊前加分一個指針大小的內存,并通過這個指針指向下一塊內存的起始地址。 p_temp=p1; *p1=(int)p_temp+size(struct)+1;//這里架設了struct是以int對齊。 ? 這個例子是一個普遍的更隱晦的實現(相對lwbt_memp_init),在lwbt_memp_init中的實現要明顯一些,主要是通過了struct memp這個結構來替代了上面的p1,這樣就更清楚了一些。?
接著,在講下malloc和free函數。通過上面對初始化函數的理解,這里,我們不難猜測這兩個函數的實現: malloc:通過類型從memp_tab數組中獲取struct memp型指針,并將其next指針賦值給memp_tab[該類型]。相當于從隱式鏈表中刪除節點。 free:通過類型將memp_tab[該類型]賦值給要回收的地址指針,即struct memp類型指針,的next指針,并將要回收的地址指針賦值給memp_tab[該類型]。相當向隱式鏈表中增加節點。 ? ?????? 不難看出memp_tab[該類型]一直都是指向該類型第一個可用的內存地址。?
值得注意的是 malloc中:mem = MEM_ALIGN((u8_t *)memp + sizeof(struct memp));其中mem是函數返回的地址,這句話就是要將開頭的struct memp(隱式鏈表節點信息)去掉,從真正的結構類型起始地址開始。 free中:memp = (struct memp *)((u8_t *)mem - sizeof(struct memp));其中mem是要回收的地址,這句話的意思與上面的相反,它是要加入隱式鏈表節點信息,以確保,memp_tab中隱式鏈表的正常運行。?
Malloc:【第一個是已分配的】 Free:【memp_tab前面的兩個都以分配,現在首要free第一個】轉載于:https://blog.51cto.com/bluefish/170130
總結
以上是生活随笔為你收集整理的lwbt的内存分配详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为C# Windows服务添加安装程序
- 下一篇: WCF技术剖析之十一:异步操作在WCF中