内存分配函数

内存分配函数

ID:41468480

大小:65.48 KB

页数:11页

时间:2019-08-25

内存分配函数_第1页
内存分配函数_第2页
内存分配函数_第3页
内存分配函数_第4页
内存分配函数_第5页
资源描述:

《内存分配函数》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、在GNU系统中,malloc或realloc返回的内存块地址都是8的倍数(如果是64位系统,则为16的倍数)。如果你需要更大的粒度,请使用memalign或valloc。这些函数在头文件“stdlib.h”中声明。在GNU库中,可以使用函数free释放memalign和valloc返回的内存块。但无法在BSD系统中使用,而且BSD系统中并未提供释放这样的内存块的途径。函数:void*memalign(size_tboundary,size_tsize)函数memalign将分配一个由size指定大

2、小,地址是boundary的倍数的内存块。参数boundary必须是2的壽!函数memalign可以分配较大的内存块,并且可以为返回的地址指定粒度。函数:void*valloc(size_tsize)使用函数valloc与使用函数memalign类似,函数valloc的内部实现里,使用页的大小作为对齐长度,使用memalign来分配内存。它的实现如下所示:void*valloc(size_tsize)returnmemalign(getpagesize(),size);}malloc()与allo

3、c()C语言跟内存分配方式!A!(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的

4、生存期由应用决定,使用非常灵活,但问题也最多C语言跟内存申请相关的函数主要有alloca,calloc,malloc,free,realloc,sbrk等淇中alloca是向栈申请内存,因此无需释放.malloc分配的内存是位于堆中的,并且没有初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部分的内存空间.calloc则将初始化这部分的内存,设置为0.而realloc则对malloc申请的内存进行大小的调整•申请的内存最终需要通过函数free来释放.而sbrk则是增加数

5、据段的大小;malloc/calloc/free基本上都是C函数库实现的,跟OS无关・C函数库内部通过一定的结构来保存当前有多少可用内存•如果程序malloc的大小超出了库里所留存的空间,那么将首先调用brk系统调用来增加可用空间,然后再分配空间.free时,释放的内存并不立即返回给os,而是保留在内部结构中.可以打个比方:brk类似于批发,一次性的向OS申请大的内存,而malloc等函数则类似于零售,满足程序运行时的要求•这套机制类似于缓冲•使用这套机制的原因:系统调用不能支持任意大小的内存分配

6、(有的系统调用只支持固定大小以及其倍数的内存申请,这样的话,对于小内存的分配会造成浪费;系统调用申请内存代价昂贵,涉及到用户态和核心态的转换.函数malloc()和calloc()都可以用来分配动态内存空间,但两者稍有区别。malloc()函数有一个参数,即要分配的内存空间的大小:Void*malloc(size_tsize);callocQ函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小:void*calloc(size_tnumElements,si

7、ze_tsizeOfElement);如果调用成功,函数malloc()和calloc()都将返回所分配的内存空间的首地址。malloc()函数和calloc()函数的主要区别是前者不能初始化所分配的内存空间,而后者能。如果由malloc()函数分配的内存空间原来没有被使用过,则其中的每一位可能都是0;反之,如果这部分内存空间曾经被分配、释放和重新分配,则其中可能遗留各种各样的数据。也就是说,使用malloc()函数的程序开始时(内存空间还没有被重新分配)能正常运行,但经过一段时间后(内存空间已被

8、重新分配)可能会出现问题。calloc()函数会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证会被初始化为零;如果你是为指针类型的元素分配内存,那么这些元素通常(但无法保证)会被初始化为空指针;如果你是为实数类型的元素分配内存,那么这些元素可能(只在某些计算机中)会被初始化为浮点型的零。malloc()函数和calloc()函数的另一点区别是calloc()函数会返个由某种对象组成的数组,但malloc()函数只返

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。