`
kmplayer
  • 浏览: 497274 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

编写自己的malloc

 
阅读更多
1,如果一个程序大量调用malloc,程序的很多时间将会消耗在malloc函数的调用上.
2,编写自己的malloc.
给出一段模板代码:
#define NODESIZE 8
#define NODEGROUP 100
int nodeleft=0;
char* freenode;

void* myMalloc(int size)
{
    void* p;
    if(size!=NODESIZE)
        return malloc(size);
    if(nodeleft==0)
    {
        freenode=malloc(NODESIZE*NODEGROUP);
        nodeleft=NODEGROUP;
    }
    nodeleft--;
    p=(void*)freenode;
    freenode+=NODESIZE;
    return p;
}


3,统计单词个数的那个实例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node *nodeptr;
typedef struct node
{
	char *word;
	int count;
	nodeptr next;
} node;

#define NHASH 29989
#define MULT 31
nodeptr bin[NHASH];

unsigned int hash(char *p)
{
    unsigned int h = 0;
	for ( ; *p; p++)
		h = MULT * h + *p;
	return h % NHASH;
}

#define NODEGROUP 1000
int nodesleft = 0;

//注意这里freenode的声明
nodeptr freenode;
nodeptr nmalloc()
{
    if (nodesleft == 0)
    {
		freenode = malloc(NODEGROUP*sizeof(node));
		nodesleft = NODEGROUP;
	}
	nodesleft--;
	return freenode++;
}

#define CHARGROUP 10000
int charsleft = 0;
char *freechar;

char *smalloc(int n)
{
    if (charsleft < n) {
		freechar = malloc(n+CHARGROUP);
		charsleft = n+CHARGROUP;
	}
	charsleft -= n;
	freechar += n; //移动freechar
	return freechar - n;
}

void incword(char *s)
{
    nodeptr p;
	int h = hash(s);
	for (p = bin[h]; p != NULL; p = p->next)
		if (strcmp(s, p->word) == 0) {
			(p->count)++;
			return;
		}
	p = (nodeptr)nmalloc();
	p->count = 1;
	p->word = smalloc(strlen(s)+1);
	strcpy(p->word, s);
	p->next = bin[h];
	bin[h] = p;
}

int main()
{
    freopen("genetic.txt","r",stdin);
    int i;
	nodeptr p;
	char buf[100];
	for (i = 0; i < NHASH; i++)
		bin[i] = NULL;
	while (scanf("%s", buf) != EOF)
		incword(buf);
	for (i = 0; i < NHASH; i++)
		for (p = bin[i]; p != NULL; p = p->next)
			printf("%s %d\n", p->word, p->count);
	return 0;
}
分享到:
评论

相关推荐

    自己编写的malloc源码

    自己写的动态内存管理源码,其中包含 malloc.c和 malloc.h两个文件,可以动态申请和释放内存

    !!malloc参考代码与注释.zip_ malloc_malloc

    lunix下用c编写malloc函数

    malloclab:系统编程实验室作业 #3

    给学生的路线在本实验中,您将为 C 程序编写一个动态存储分配器。 目标是实现一个正确、高效和快速的分配器。 文件: mm.{c,h} 你的解决方案 malloc 包。 mm.c 是您将要提交的文件,并且是您应该修改的唯一文件。 ...

    小弟自己编写的Json类库,希望大家碰提提意见

    小弟自己编写的Json类库,希望大家碰提提意见 QQ:61844330

    fml:LD_PRELOAD hack可以在sqlite数据库中保存malloc和自由操作

    基于我很久以前在glibc中使用__malloc_hook / __free_hook编写的内容。 由于现在已将这些标记为“已弃用”,因此我使用以下建议重写了这些内容: 构建: gcc -Wall -o fml.so fml.c -shared -fPIC -ldl -lsqlite3...

    shu2.rar_K._malloc.h

    编写递归算法,在二叉树中求位于先序序列中第K个位置的结点 [输入] 按照先序序列的顺序输入该结点的内容。其输入abd eh cf i g 。输入要求的位置 [输出] 若二叉树不空,按先序序列输出,求出所求位置的结点 [存储...

    低成本MEMS INS系统 + GNSS组合导航序贯滤波-C语言程序(采用malloc动态分配内存空间)

    相比于上一个程序将文件提取出的数据导入到结构体数组中,本程序改为malloc动态分配内存空间,具体操作过程请看我的博客: https://blog.csdn.net/qq_38364548/article/details/128851020 本程序是仿照仿照严老师...

    在STM32单片机裸机情况下实现内存管理(即实现malloc函数编写).zip(毕设/课设/竞赛/实训/项目开发)

    嵌入式优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人单片机开发经验充足,深耕嵌入式领域,有任何使用问题欢迎随时与我联系,我会...

    csci2400-lab6-malloclab

    在本实验中,您将为C程序编写一个动态存储分配器,即您自己的malloc , free和realloc例程版本。 鼓励您创造性地探索设计空间并实现正确,高效和快速的分配器。 后勤 您最多可以两个人组成一组。 对作业的任何澄清和...

    Unix系统编程---makefile的编写

    Unix系统编程---makefile的编写Unix系统编程---makefile的编写Unix系统编程---makefile的编写

    red hat c 编写的结构体通讯录

    系统函数的在red hat 下c编程基本的应用 1、 通讯录采用struct定义结构;...2、 通讯录数据使用malloc动态分配内存,而不要使用静态数组; 3、 尽量把通讯录列表建成一种单向链表的形式,提高新增和删除的效率。

    C语言编写的矩阵算法

    用C语言编写的矩阵算法,用于加减乘除、求逆、求det、求norm等等。 可以用于嵌入式系统,唯一的限制是能用malloc函数。

    C语言程序设计深度剖析

    本书深入浅出地论述了C语言的的各个基础方面,特别是指针,强调编写高质量代码,C/C++菜鸟到大牛的必备书籍之一。

    STM32F103单片机HAL库例程-内存malloc管理实验.rar

    例程经过精心编写,简单好用。 2、代码使用KEIL HAL库开发,当前在STM32F103运行,如果是STM32F103其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 3、软件下载时,请注意keil选择项是jlink还是...

    二叉树的基本操作 源代码

    (1)编写二叉排序树的基本操作函数。 ①查找结点函数 SearchNode(TREE *tree,int key,TREE **pkpt,TREE **kpt) ②二叉排序树插入函数 InsertNode(TREE **TREE,int key) ③二叉排序树删除函数 DeleteNode...

    火车票务系统(c语言编写的)

    火车票务系统,用c语言编写的。 /*录入函数*/ void RearInsert(LinkList &L) //尾部插入结点 { char chars[5][20] ; float price ; LinkList p = L; printf("输入添加的记录: \n") ; printf("请输入列车...

    parttwo 菜单的工作原理及编写应用

    parttwo 菜单的工作原理及编写应用parttwo 菜单的工作原理及编写应用parttwo 菜单的工作原理及编写应用parttwo 菜单的工作原理及编写应用

    用C编写班级成绩管理系统

    4、针对构想出来的界面进行程序的编写。 最后,感谢老师您对我的指导和从百忙中抽空看我的设计,谢谢! 附件: 源程序: #include "stdio.h" /*I/O函数*/ #include "stdlib.h" /*其它说明*/ #include ...

    partone 菜单的工作原理及编写应用

    partone 菜单的工作原理及编写应用partone 菜单的工作原理及编写应用partone 菜单的工作原理及编写应用partone 菜单的工作原理及编写应用

    线程代码编写

    head=(pcb *)malloc(sizeof(pcb));/*创建一个空表头*/ p=head; for(i=1;i;i++)/*用循环来创建指定个结点*/ { q=(pcb *)malloc(sizeof(pcb)); p-&gt;next=q; q-&gt;num=i; q-&gt;next=NULL; q-&gt;priority=(int)10*...

Global site tag (gtag.js) - Google Analytics