c内存池设计(编辑修改稿)内容摘要:
池分配内存函数 by 风清扬 song 130728 *****************************************/ void CMemePool::AllocPoolMemeroy() { //计算 需要的链表节点数目 CalLinkNodeNum()。 //计算真正要分配的内存大小 CalMemeSize()。 m_AllNumber = m_AllNumber + m_Number。 m_AllAloctsize += m_MemePollSize。 m_MemePoolFreeSize += m_MemePollSize。 //追加分配内存,原有内存的内容不会受到影响 m_PAlloc = (EigthByte *)realloc(m_PAlloc,(m_AllAloctsize)*sizeof(EigthByte))。 //内存分配失败 if(NULL == m_PAlloc) { m_sError = Alloc Memeroy Pool Failture。 return。 } //不是第一次分配内存 if(false == m_isFirst) { //新分配内存后原有指针全失效,需要重定向 ResetLinkToMemery()。 } //分配的内存内容初始化 // memset(((void *) PAlloc), NEW_ALLOCATED_MEMORY_CONTENT, m_MemePollSize)。 //将分配的线程池内存与链表节点关联 LinkMemeryToNode(amp。 m_PAlloc[m_AllAloctsize m_MemePollSize])。 } /***************************************** 将原内存的指针进行重定向( Alloc 后原有内存可能被释放了) by 风清扬 song 130728 *****************************************/ void CMemePool::ResetLinkToMemery() { TMemeLinkNode *pTemp = m_Headnext。 int iIndex = 0。 while(NULL != pTemp) { //重定向指针链表的指向 pTempData = amp。 m_PAlloc[iIndex * m_MemLinkSize]。 if(NULL != pTemppUser) { //重定向用户指针的指向 *pTemppUser = pTempData。 } iIndex++。 pTemp = pTempnext。 } } /***************************************** 计算需要的内存链表节点数目 by 风清扬 song 130728 *****************************************/ void CMemePool::CalLinkNodeNum() { float fTempValue = m_MemePollSize / m_MemLinkSize。 //向上取整需要的节点数目 m_Number = ceil(fTempValue)。 } /***************************************** 计算内存池真正分配的内存的大小 by 风清扬 song 130728 *****************************************/ void CMemePool::CalMemeSize() { m_MemePollSize = (size_t)(m_Number * m_MemLinkSize)。 } /***************************************** 将分配的内存和链表节点相关联 by 风清扬 song 130728 *****************************************/ void CMemePool::LinkMemeryToNode(EigthByte *PAlloc) { TMemeLinkNode *PNode。 //遍历每一个节点分配空间 for(size_t iIndex = 0。 iIndex m_Number。 iIndex ++) { PNode = new TMemeLinkNode()。 if(NULL == m_LastNode) { PNodenext = m_Headnext。 m_Headnext = PNode。 PNodefirst = m_Head。 m_LastNode = PNode。 } else { PNodenext = m_LastNodenext。 m_LastNodenext = PNode。 PNodefirst = m_LastNode。 m_LastNode = PNode。 } m_LastNodeisUsed = false。 m_LastNodeidataSize = m_MemePollSize iIndex * m_MemLinkSize。 m_LastNodeData = amp。 PAlloc[iIndex * m_MemLinkSize]。 m_LastNodeisMemeBegin = false。 m_LastNodepUser = NULL。 //记录内存块的首地址,释放时使用 if(true == m_isFirst amp。 amp。 0 == iIndex) { m_LastNodeisMemeBegin = true。 m_isFirst = false。 } } UpdateLinkNodeSize(m_LastNode)。 } /***************************************** 更新当前节点的前后大小值 by 风清扬 song 130728 *****************************************/ void CMemePool::UpdateLinkNodeSize(TMemeNode *PNode) { TMemeNode *PTemp。 PTemp = PNodenext。 int iDateSize = 0。 //当前节点的后一个节点没分配,得到它的 DataSize 值 if(NULL !=。c内存池设计(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。