[APR源码解析]APR源码精髓

APR源码都是一些高人不断持续的开发,很多算法做得非常巧妙,现在把这些精髓慢慢记录,以便将来能用上。

1. 块内存索引

   APR 内存采取的则是“规则块”分配原则。支持的分配的最小空间是 8K,如果分配的空间达不到 8K 的大小,则按照 8K 去分配;如果需要的空间超过 8K,则将分配的空间往上调整为 4K 的倍数。这样内存就可以用索引来决定内存块的大小,索引和实际大小的转换关系为:index = (size >> BOUNDARY_INDEX) - 1;

2. 用二维指针记录上一个节点的next指针

   APR在制作链表结构时,并不是用一个指针分别指向下一个节点和上一个节点。而是采用二维指针变量记录上一个节点的next指针。因为链表插入或删除操作时只是改变next指针而已。

例如:

struct apr_memnode_t的apr_memnode_t **ref;

apr_pool_cleanup_kill函数中的 lastp = &c->next;

3. 所有和链表插入或获取时有关的,都是采用更换链表头节点

   APR对链表中的节点操作时,总是使用到头节点,这样操作时效率是最高的。所以很多链表操作时,最好能转换为这种模式。

例如:

allocator_free函数的freelist链表

  node->next = freelist;freelist = node; 这样node就成为 freelist的头节点了。

apr_pool_cleanup_register函数中p->free_cleanups链表

 

  c = p->free_cleanups;p->free_cleanups = c->next;  这样就从free_cleanups获取头节点

  c->next = p->cleanups;p->cleanups = c;   这样c就成为p->cleanups的头节点了

apr_pool_cleanup_kill函数的p->free_cleanups

  c->next = p->free_cleanups;p->free_cleanups = c;

 

这些例子很多.....

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值