云风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. ...
随机推荐
- C语言的问卷调查
1.你对自己的未来有什么规划?做了哪些准备? 未来想当一个网络工程师,为了这个目标我正在努力学习网络.网页及相关的知识. 2.你认为什么是学习?学习有什么用?现在学习动力如何?为什么? 学习就是不断尝 ...
- [codecademy]fonts in css
Great job! You learned how to style an important aspect of the user experience: fonts! Let's review ...
- ViewController 视图控制器的常用方法
ViewController 视图控制器 ,是控制界面的控制器,通俗的来说,就是管理我们界面的大boss,视图控制器里面包含了视图,下面举个例子,让视图在两个视图上调转. 定义一个视图控制器: MyV ...
- 78W的数据使用forall 进行批量转移;
create or replace procedure test_forall(CURRENTPAGE number ) as .--CURRENTPAGE number :=2 ; .PAGESIZ ...
- jenkin重新注册用户
http://www.cnblogs.com/xiao-fy/
- RAID卡服务器安装2003教程
这里先讲讲安装系统的几个思路: 1.U盘安装法(U盘只做可启动PE,常用的大白菜,IT天空,老毛桃.....拷贝系统ISO镜像到U盘,进入PE之后找到ISO,用虚拟光驱加载,运行WIN系统安装器 ...
- 【Python】python 反射机制在实际的应用场景讲解
剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...
- CSUOJ1329——一行盒子_湖南省第九届大学生计算机程序设计竞赛
题目是中文的我就不是说明了,比赛的时候看过题目后队友说是splay来做,细想来省赛不会出这么坑的题目吧. 于是比赛还有一个小时左右把该做的都做完了以后,我们队三个人都来思考这个题目了.不过还好很快我们 ...
- BZOJ 2186 沙拉公主的困惑(预处理逆元+欧拉函数)
题意:求1-n!里与m!互质的数有多少?(m<=n<=1e6). 因为n!%m!=0,所以题目实际上求的是phi(m!)*n!/m!. 预处理出这些素数的逆元和阶乘的模即可. # incl ...
- 【uoj#51】[UR #4]元旦三侠的游戏 博弈论+dp
题目描述 给出 $n$ 和 $m$ ,$m$ 次询问.每次询问给出 $a$ 和 $b$ ,两人轮流选择:将 $a$ 加一或者将 $b$ 加一,但必须保证 $a^b\le n$ ,无法操作者输,问先手是 ...