版权声明: 本文章由vt.buxiu发布在www.vtzone.org,版权归vtzone研究小组所有,转载请保持此声明!!!
@@内容摘要:以简单的C代码介绍malloc应该具有的功能和接口,也许各种分配器算法差异很大,但其按照标准C约定,所提供给用户的接口必须一样,功能也一样(性能有差异)。@@
Malloc的简单实现C标准库中提供的手工管理内存的函数定义在stdlib.h,包括以下四个函数:
void *calloc(size_t num, size_t size);
void free(void *);
void *malloc(size_t);
void *realloc(void *block, size_t size);
其中malloc/free大家比较熟悉,我们的示例中仅仅简单的将应用的内存请求转交给操作系统(^_^)处理:
//关于GetProcessHeap(),HeapAlloc(),HeapFree()的用法请参考MSDN。
HADLE
handle = GetProcessHeap();
void malloc(size_t size)
{
return HeapAlloc(handle,HEAP_ZERO_MEMORY, size);
}
void free(void * mem)
{
return HeapFree(handle,HEAP_NO_SERIALIZE,mem);
}
对于calloc/realloc可能有些陌生,下面通过两端小代码介绍calloc/realloc的原理。我们使用malloc/free来实现calloc/realloc,真正做事情的是malloc和free:
void *calloc(size_t num, size_t size)
{
void *ptr = NULL;
size_t nbytes = 0;
nbytes = num*size;
ptr = malloc(nbytes);
if(ptr!=NULL){ memset(ptr, 0x0,nbytes); }
return ptr;
}
void *realloc(void *ptr, size_t size)
{
unsigned char *cptr = NULL;
int oldsize = 0;
if (ptr == NULL){ return malloc(size); }
oldsize = sizeMem(ptr);
if (size <= oldsize){ return ptr; }
cptr = (char *)malloc(size);
memcpy(cptr, ptr, oldsize);
free(ptr);
return cptr;
}
通过上面两端小代码,对于calloc/realloc的作用应该很清楚了吧,当然实际的内存库实现中很少有用通过malloc/free来实现realloc的,因为在realloc向扩展内存的时候,分配器会真的尝试能否扩展,只有扩展不成功的时候才会进行类似上面事例的代码进行一次内存拷贝。
至于malloc和free的实现在各个平台下的各个Libc发布版本中差异很大。Unix通常通过brk系统调用实现。
Brk不是POSIX标准,但几乎所有Unix系统都提供这个函数,如果你对这个函数的实现有兴趣,可以参考Linux的/usr/src/linux/mm/mmap.c 。
接下来我们将分别介绍]广泛应用的Linux libc的dlmalloc,FreeBSD libc的phkmalloc,Solaris libc的malloc系列。在这之后再介绍C++对象内存管理需要思考的问题,以及sgi STL介绍。
最后介绍多核或多处理器环境下的内存管理算法Hoard,然后再次讨论小对象分配技术。
作者:vt.buxiu@www.vtzone.org
5 个解决方案
#1
HeapAlloc()是C标准库中的函数吗?
#2
作业系统的api
#3
学习学习
#4
好像有问题,至少windows中不是这么做的
#5
这个实现太中规中矩了。接分吧。
#1
HeapAlloc()是C标准库中的函数吗?
#2
作业系统的api
#3
学习学习
#4
好像有问题,至少windows中不是这么做的
#5
这个实现太中规中矩了。接分吧。