#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. 关于双系统下Ubuntu不能访问Windows中某个盘的问题

    1.问题描述   在Ubuntu系统下访问Windows系统中磁盘时出现无法访问的情况,具体如下显示:   该问题为磁盘挂载错误,需要进行修复. 2.解决办法   (1)打开终端:如果没有安装ntfs ...

  2. Throwable、Error、Exception、RuntimeException 区别 联系

    1.Throwable 类是 Java 语言中所有错误或异常的超类.它的两个子类是Error和Exception: 2.Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获 ...

  3. J2EE面试常见试题

    一.基础问答 1.下面哪些类可以被继承? java.lang.Thread (T) java.lang.Number (T) java.lang.Double (F) java.lang.Math  ...

  4. ltnmp 3.0 发布,PHP 开发环境一键安装包

    PHP 开发环境一键安装包, 有个叫lnmp.这个ltnmp看起来更新比较多,开发比较频繁,包括的组件更多. 安装和使用教程:http://www.moqifei.com/ltnmp 标记一下.

  5. HDFS shell命令行常见操作

    hadoop学习及实践笔记—— HDFS shell命令行常见操作 附:HDFS shell guide文档地址 http://hadoop.apache.org/docs/r2.5.2/hadoop ...

  6. maven Web项目中POM的配置信息

    什么是POM? POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml.在Maven中,当谈到Project的时候, ...

  7. 分页---Vue+.net+bootstrap实现

    通过学习Vue,的确觉的Vue的双向绑定使用起来十分方便,因此研究了一下列表显示时分页的实现,这里我使用了bootstrap的样式,所以在页面中引用bootstrap的样式文件,后台提数据源使用.ne ...

  8. web端调百度地图页面

    在点击进入地图的入口(下面数据是vue渲染的数据) <a class="navigation" v-if="merchant.longitude && ...

  9. BZOJ 1266 上学路线(最短路+最小割)

    给出n个点的无向图,每条边有两个属性,边权和代价. 第一问求1-n的最短路.第二问求用最小的代价删边使得最短路的距离变大. 对于第二问.显然该删除的是出现在最短路径上的边.如果我们将图用最短路跑一遍预 ...

  10. MySQL慢查询日志ES索引模板

    { "template": "mysql-slow-log-*", "settings": { "index": { & ...