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