| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 687 人关注过本帖
标题:[讨论]经典书kernighan的<<程序设计实践>>中的一个值得讨论的问题
只看楼主 加入收藏
giky2323
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2005-12-24
收藏
 问题点数:0 回复次数:2 
[讨论]经典书kernighan的<<程序设计实践>>中的一个值得讨论的问题

学习<<程序设计实践>>这本书时遇到一个值得与大家讨论的问题

题目如下:

为c语言的字符串专门写一个存储分配器smalloc,它对小字符串使用一个专用分配器,对大字符串则直接调用malloc。在这种情况下,你可能需要定义一个struct,以表示串的两种情况,你怎样确定何时从调用smalloc转到malloc?

拿到这个问题很郁闷,完全摸不着头脑,不知道作者的意思是要往哪个方面改进。原来的malloc有什么不妥的。

想了下决定从以下几个方面来弄清楚这几个问题
1。Malloc内部函数是怎样的??.
2。大小空间都直接用Malloc分配有什么不好的
3。用Struct有什么用
4。.“怎样确定何时从调用smalloc 转到malloc”是怎么回事,具体折大小怎么确定,依据是什么 
5。Smalloc是怎么写的


研究了许久
翻阅了<<the c programming language>>
与其它的书
解决了1,2两个问题
答案如下

可是对于第3,4,5这几个问题还是没有搞明白
不明白作者为什么建议用struct
还有第4个问题。

想了许久想不出结果来挺闷的
有兴趣的一起讨论讨论

搜索更多相关主题的帖子: 程序设计 kernighan 经典 实践 
2005-12-24 18:37
giky2323
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2005-12-24
收藏
得分:0 

问题1的答案
typedef long Align; /* for alignment to long boundary */

union header { /* block header */
struct {
union header *ptr; /* next block if on free list */
unsigned size; /* size of this block */
} s;
Align x; /* force alignment of blocks */
};


static Header base; /* empty list to get started */
static Header *freep = NULL; /* start of free list */

/* malloc: general-purpose storage allocator */
void *malloc(unsigned nbytes)
{
Header *p, *prevp;
Header *moreroce(unsigned);
unsigned nunits;

nunits = (nbytes+sizeof(Header)-1)/sizeof(header) + 1;
if ((prevp = freep) == NULL) { /* no free list yet */
base.s.ptr = freeptr = prevptr = &base;
base.s.size = 0;
}
for (p = prevp->s.ptr; ; prevp = p, p = p->s.ptr) {
if (p->s.size >= nunits) { /* big enough */
if (p->s.size == nunits) /* exactly */
prevp->s.ptr = p->s.ptr;
else { /* allocate tail end */
p->s.size -= nunits;
p += p->s.size;
p->s.size = nunits;
}
freep = prevp;
return (void *)(p+1);
}
if (p == freep) /* wrapped around free list */
if ((p = morecore(nunits)) == NULL)
return NULL; /* none left */
}
}

2005-12-24 18:37
giky2323
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2005-12-24
收藏
得分:0 

问题2的答案如下

写专用的存储分配程序。经常可以看到这种情况,程序里的惟一热点就是存储分配。表现为对malloc和free的大量调用。如果程序中需要的经常是同样大小的存储块,采用一个特定用途的存储分配器取代一般的分配器,有可能使速度得到实质性提高。这种特定的存储分配器调用malloc一次,取得基本存储块的一个在数组,在随后需要时一次同去一块,这是一个代价很低的操作。释放后的存储块接在一个自由表的最后,这使它们可以产即重新投入使用。
如果所需要的块在大小上差不多,你也可以用空间来交换时间,总是分配能够满足最大需求的块。对所有长度不超过某个特定值的字符串都使用同样大小的块,这是管理短字符串的一种有效方法。
有些算法可以采用栈方式的存储管理,先完成了一系列的存储分配,然后将整个集合一下子释放掉。在这种情况下,分配器可以先取得一个大块,而后像用一个栈似的使用它,需要的时候将分配的项目压入,结束时通过一个操作就把它们都弹出去。有些C函数库这种分配方式提供了一个ALLOCA函数,但它不是标准的。这个函数用一个局部栈作为存储资源,当调用ALLOC的函数返回时,自动释放掉所有的项目。

2005-12-24 18:38
快速回复:[讨论]经典书kernighan的<<程序设计实践>>中的一个值得讨论的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015217 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved