云风pbc源码alloc.c
#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的更多相关文章
- 在Quick-cocos2dx中使用云风pbc解析Protocol Buffers,支持win、mac、ios、android
本例主要介绍 如何将 pbc 集成到quick-cocos2dx框架中,让我们的cocos2dx客户端Lua拥有编解码Protocol Buffers能力. 参考: 云风pbc的用法: http:// ...
- 一元云购完整源码 云购CMS系统 带安卓和ios手机客户端
看起来不错的一套一元云购CMS源码,源码包里面带了安卓和ios手机客户端,手机客户端需要自己反编译. 这里不做功能和其它更多的介绍,可以自己下载后慢慢测试了解. 下面演示图为亲测截图< ...
- 2016最新一元云购完整源码 云购CMS系统 带安卓和ios手机客户端 源码免费分享
原文转自:http://www.zccode.com/thread-724-1-1.html 该资源说明: 看起来不错的一套一元云购CMS源码,源码包里面带了安卓和ios手机客户端,手机客户端需要自己 ...
- cocos2d-x 3.1 集成 云风pbc
cocos2d-x 3.x版本号变动比較大,从改用cmake管理整个项目,到使用python集成一体化的项目工具. 这些都是我喜欢的.我能够非常easy的在我的ubuntu上面搭建好开发环境,并且根本 ...
- Face++云相册应用IOS源码
该源码是一个不错的相册应用,Face++云相册应用源码,以人脸识别作为用户注册和登录的依据,登录后可以进入用户的云相册空间,并对相册进行上传图片或删除图片,另添加了分享功能. <ignore_j ...
- 阿里云centos postgresql9.4源码安装 精简步骤、问题解答
阿里云centos环境源码安装postgresql9.4 本文的安装步骤主要来源于http://www.cnblogs.com/mchina/archive/2012/06/06/2539003.ht ...
- 2013年9月份第1周51Aspx源码发布详情
大型B2B家具门户网源码 2013-9-6 [VS2008]功能描述: 1.门户信息管理 安全取数据即使数据库连接中断不会报错 2.稳定性 每句代码经过3次以上检查.此网站还在运营3年了,没有出过问 ...
- Nginx 源码安装和调优
常见web架构: LAMP =Linux+Apache+Mysql+PHP LNMP =Linux+Nginx+Mysql+PHP nginx概述: 知道:1 不知道:2 Nginx (&q ...
- 大型三甲HIS系统最新C#源码医院信息管理系统NET源码门诊住院医嘱药房药库发药管理源码
查看医疗信息管理his系统演示 本云his系统源码,适用在县乡一体化,医联体分级诊疗项目上,本源码开发语言asp.net c#,数据库sqlserver2012,开发工具vs2015.技术框架mvc. ...
随机推荐
- vs调试iisExpress经常卡死
最近调试一个项目时,电脑经常卡死,不得不强制重启,一直不知道iisExpress为何卡死的. 想了很多办法,强制删除bin里面的文件,结果不行: 企图删除iisExpress虚拟目录中的文件也不行: ...
- 第六章 过滤器Filter
Filter概述 Filter不用于客户端请求,只用于对request,response进行修改或对context,session,request事件进行监听. 1.概述 如上图,多个filter组成 ...
- 第5章 首次登录与在线求助man page
首次登录系统 centos默认图像界面为GNOME. Linux默认情况下会提供6个Terminal来让用户登录,切换方式为ctrl+alt+[F1-F6],系统将这六个操作界面命名为tty1-tty ...
- python 将base64字符串还原为图片
今天弄验证码的时候发现,验证码的图片的src竟然是下面的这么一个一串字符串,吓到,好像不可以http请求的,第一次见,就好尴尬,去网上搜索了一下,说是: 这是Data URI scheme. data ...
- 【Linux】- 六个超赞的字符画生成器
ASCII是一个非常吸引人的字符编码系统,在计算机,通讯设备,以及其他设备中,通过它来用代码表示字符.新生代的人可能会觉得它已经过时了,但是那些熟悉它的人会懂得ASCII是多么的独特.我们在这里为你准 ...
- 简单的 php 防注入、防跨站 函数
/** * 简单的 php 防注入.防跨站 函数 * @return String */ function fn_safe($str_string) { //直接剔除 $_arr_dangerChar ...
- webgl helloworld
之前的webgl 初识1, 初识2 已经介绍了webgl的基本概念,工作原理. 没有理解的自己yy. 现呈上例子一枚 <!DOCTYPE html> <html lang=" ...
- TP中if标签
if标签 If标签如果php中if语句的作用,if是用于流程控制的. 在ThinkPHP中if标签也是用于流程控制的. If标签的语法格式: <if condition=’条件表达式’> ...
- Hadoop基于Protocol Buffer的RPC实现代码分析-Server端--转载
原文地址:http://yanbohappy.sinaapp.com/?p=110 最新版本的Hadoop代码中已经默认了Protocol buffer(以下简称PB,http://code.goog ...
- 【bzoj1502】[NOI2005]月下柠檬树 自适应Simpson积分
题目描述 李哲非常非常喜欢柠檬树,特别是在静静的夜晚,当天空中有一弯明月温柔地照亮地面上的景物时,他必会悠闲地坐在他亲手植下的那棵柠檬树旁,独自思索着人生的哲理.李哲是一个喜爱思考的孩子,当他看到在月 ...