APR_DECLARE(void *) apr_palloc(apr_pool_t *pool, apr_size_t in_size)
{
将in_size调整为index整数倍的
/*先查看active节点,active是内存池中的激活节点,所有的内存都从这个节点中分配*/
if(active节点就能够满足分配要求)
{
直接从active分配内存
返回了
/*这里不会往下执行,直接返回了,也就不会理睬在active分配内存之后,还是不是链表中的最大
节点,所以tingya的对这个地方的解释不完全正确,应该是active节点是不会理睬有多大的,反正所有的内存都从
active节点分配,当active节点不够分配时,就更换active节点.从active->next开始的链表,是按照可用空间从大
到小排序的*/
}
查看active->next节点/*是链表中最大的节点,如果这个节点都不够分,就只能从分配子中提取节点了*/
if(active->next节点能够满足要求)
{
把这个节点从链表中提取出来,用node表示;
}
else
{
从分配子从获取节点,用node表示;
}
/*此时内存已经分配出来了,并且是从node节点中分配的*/
/*所以接下来我要用node把active替换掉,让active回到链表中,并且是回到排序后的位置上,看代码:*/
把node放到active链表头,即挤掉原active的位置
用active的可用大小去和链表后面的节点依次做比较,插入到合适的位置.
/*因为每次我都做的是相同的操作,所以我不需要再对整个链表进行排序就可以保证链表是从大到小排序
的*/
返回内存起始地址;
}
分享到:
相关推荐
`apr_palloc`或`apr_pcalloc`函数用于从内存池中分配内存,它们分别对应于标准C库的`malloc`和`calloc`,但使用内存池实现。 3. 释放:内存池管理着所有分配的内存,当不再需要某块内存时,不需要立即释放。相反,...
`apr_pool_create`函数创建一个新的内存池,而`apr_palloc`和`apr_pcalloc`分别用于分配和初始化内存。内存池通过一次性分配大块内存,然后在需要时从中分配小块,减少了系统调用的开销。当内存池被销毁时,所有通过...
2. **内存分配**:在内存池中分配内存时,使用`apr_palloc`或`apr_pcalloc`等函数。这些函数会从内存池中找寻合适的空闲块,而不是每次都向操作系统申请。 3. **内存释放**:当不再需要某块内存时,无需调用释放函数...
使用`apr_palloc()`或`apr_pcalloc()`函数可以从内存池中申请内存,这两个函数的区别在于`apr_pcalloc()`会在分配内存前进行清零操作。一旦内存不再使用,我们并不直接释放,而是等待内存池被销毁时一起释放。这是...
modhello_config *newcfg = (modhello_config *) apr_pcalloc(p, sizeof(modhello_config)); return (void *) newcfg; } // 参数读取函数 static const char* set_modhello_string(cmd_parms *parms, void *...