#include <stdlib.h>
#include <stdio.h> // 用于统计内存的申请和释放次数匹配
static int _g = ; void * _pbcM_malloc(size_t sz) {
++ _g;
return malloc(sz);
} void _pbcM_free(void *p) {
if (p) {
-- _g;
free(p);
}
} void* _pbcM_realloc(void *p, size_t sz) {
return realloc(p,sz);
} void _pbcM_memory() {
printf("%d\n",_g);
} // 链表节点,用于记录每一块内存的首地址
struct heap_page {
struct heap_page * next;
}; // 整个链表的入口,附加记录第一个heap_page节点的尺寸信息,后续节点不会记录
struct heap {
struct heap_page *current;
int size;
int used;
}; struct heap *
_pbcH_new(int pagesize) {
int cap = ;
// 保证cap大于pagesize并且是1024的倍数
while(cap < pagesize) {
cap *= ;
}
// heap结构中的尺寸记录的是current指向的heap_page节点
struct heap * h = (struct heap *)_pbcM_malloc(sizeof(struct heap));
// 这里这个内存申请尺寸 sizeof(struct heap_page) + cap
// 申请的这块内存尺寸为 cap,但是需要在内存块头部附加链表节点即sizeof(struct heap_page),这样就用heap_page把每块内存串起来了
// 也就是每个内存块都要在头部额外使用struct heap_page结构串联
h->current = (struct heap_page *)_pbcM_malloc(sizeof(struct heap_page) + cap);
h->size = cap;
h->used = ;
h->current->next = NULL;
return h;
} void
_pbcH_delete(struct heap *h) {
// 遍历heap_page,全部删除
struct heap_page * p = h->current;
struct heap_page * next = p->next;
for(;;) {
_pbcM_free(p);
if (next == NULL)
break;
p = next;
next = p->next;
}
_pbcM_free(h);
} void*
_pbcH_alloc(struct heap *h, int size) {
// 取得的size大于传入的size并且是4的倍数
size = (size + ) & ~;
// 判断heap->current指向的heap_page是否有足够的内存空间
if (h->size - h->used < size) {
struct heap_page * p;
// heap->size是默认的每个内存块的大小,若可以还是申请heap->size尺寸的内存块
if (size < h->size) {
p = (struct heap_page *)_pbcM_malloc(sizeof(struct heap_page) + h->size);
} else {
p = (struct heap_page *)_pbcM_malloc(sizeof(struct heap_page) + size);
}
// 直接将新创建的内存块插入到链表头,heap也只记录新创建的内存块,原来的内存块被链表串连,只能等待后续的内存释放
p->next = h->current;
h->current = p;
h->used = size;
// (p+1) 是为了指向真正的内存,而不是每个内存块头部的heap_page结构,p+1就是移动一个heap_page的空间
return (p+);
} else {
// 返回内存块未使用部分
// (char *)(h->current + 1) 是为了指向真正的内存,而不是每个内存块头部的heap_page结构
char * buffer = (char *)(h->current + );
buffer += h->used;
h->used += size;
return buffer;
}
}

云风pbc源码alloc.c的更多相关文章

  1. 在Quick-cocos2dx中使用云风pbc解析Protocol Buffers,支持win、mac、ios、android

    本例主要介绍 如何将 pbc 集成到quick-cocos2dx框架中,让我们的cocos2dx客户端Lua拥有编解码Protocol Buffers能力. 参考: 云风pbc的用法: http:// ...

  2. 一元云购完整源码 云购CMS系统 带安卓和ios手机客户端

    看起来不错的一套一元云购CMS源码,源码包里面带了安卓和ios手机客户端,手机客户端需要自己反编译.    这里不做功能和其它更多的介绍,可以自己下载后慢慢测试了解.    下面演示图为亲测截图< ...

  3. 2016最新一元云购完整源码 云购CMS系统 带安卓和ios手机客户端 源码免费分享

    原文转自:http://www.zccode.com/thread-724-1-1.html 该资源说明: 看起来不错的一套一元云购CMS源码,源码包里面带了安卓和ios手机客户端,手机客户端需要自己 ...

  4. cocos2d-x 3.1 集成 云风pbc

    cocos2d-x 3.x版本号变动比較大,从改用cmake管理整个项目,到使用python集成一体化的项目工具. 这些都是我喜欢的.我能够非常easy的在我的ubuntu上面搭建好开发环境,并且根本 ...

  5. Face++云相册应用IOS源码

    该源码是一个不错的相册应用,Face++云相册应用源码,以人脸识别作为用户注册和登录的依据,登录后可以进入用户的云相册空间,并对相册进行上传图片或删除图片,另添加了分享功能. <ignore_j ...

  6. 阿里云centos postgresql9.4源码安装 精简步骤、问题解答

    阿里云centos环境源码安装postgresql9.4 本文的安装步骤主要来源于http://www.cnblogs.com/mchina/archive/2012/06/06/2539003.ht ...

  7. 2013年9月份第1周51Aspx源码发布详情

    大型B2B家具门户网源码  2013-9-6 [VS2008]功能描述: 1.门户信息管理 安全取数据即使数据库连接中断不会报错 2.稳定性 每句代码经过3次以上检查.此网站还在运营3年了,没有出过问 ...

  8. Nginx 源码安装和调优

    常见web架构: LAMP  =Linux+Apache+Mysql+PHP LNMP  =Linux+Nginx+Mysql+PHP   nginx概述: 知道:1  不知道:2 Nginx (&q ...

  9. 大型三甲HIS系统最新C#源码医院信息管理系统NET源码门诊住院医嘱药房药库发药管理源码

    查看医疗信息管理his系统演示 本云his系统源码,适用在县乡一体化,医联体分级诊疗项目上,本源码开发语言asp.net c#,数据库sqlserver2012,开发工具vs2015.技术框架mvc. ...

随机推荐

  1. CodeForces 154A Hometask dp

    题目链接: http://codeforces.com/problemset/problem/154/A 题意: 给你一个字符串,和若干模板串(长度为2),至少删除多少个字母,使得字符串的字串里面没有 ...

  2. purcell的emacs配置中的自动补全功能开启

    标记一下,原文参看purcell的emacs配置中的自动补全功能开启 修改init-auto-complete.el文件 ;;(setq-default ac-expand-on-auto-compl ...

  3. 如何给一块新硬盘安装grub,让它成为一个只有一个内核的系统

    (1)先关机 (2)添加一块硬盘 (3)将硬盘分区,/dev/sdb1为boot分区,/dev/sdb2为swap分区, /dev/sdb3为根分区 (4)调整/dev/sdb2的分区类型为82,指定 ...

  4. 正规文法转化DFA

    #include<string.h>#include<stdio.h>#include<stdlib.h>int main(){    char p[30][30] ...

  5. Ansible基础配置与常用模块使用

    环境介绍: Ansible服务端IP:192.168.2.215 Ansible客户端IP:192.168.2.216.192.168.2.218.192.168.2.113   一.创建Ansibl ...

  6. PHP 多文件打包下载 zip

    <?php $zipname = './photo.zip'; //服务器根目录下有文件夹public,其中包含三个文件img1.jpg, img2.jpg, img3.jpg,将这三个文件打包 ...

  7. java map 当key相同的时候 最后一个覆盖最近的一个值

  8. 【bzoj3576】[Hnoi2014]江南乐 博弈论+SG定理+数学

    题目描述 两人进行 $T$ 轮游戏,给定参数 $F$ ,每轮给出 $N$ 堆石子,先手和后手轮流选择石子数大于等于 $F$ 的一堆,将其分成任意(大于1)堆,使得这些堆中石子数最多的和最少的相差不超过 ...

  9. day06 小数据池和编码

    一. 上次课内容回顾字典:由{}括起来. 每个元素用逗号隔开, key:value的形式存储数据key: 不可变的. 可哈希的.增删改查:1. 增加: 直接用新key来赋值. dict[key] = ...

  10. 【明哥报错簿】之【inside the host appBase has been specified, and will be ignored】和【did not find a matching property.】

    tomcat启动时有时候会报一些警告,项目有时候也是可以正常运行.但是警告出现还是要找到原因消灭掉,两个典型的警告解决办法如下: 1.[inside the host appBase has been ...