ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

动态内存分配

2019-09-05 17:02:06  阅读:281  来源: 互联网

标签:malloc sbrk void break program 内存 动态内存 分配


堆是一段长度可变的连续虚拟内存。始于BBS段的末尾,随着内存的分配和释放而增减,堆的当前内存边界成为 program break

linux提供的系统调用:brk()和sbrk()。

#include<uinstd.h>

//return 0 on success,or -1 on error
int brk(void*end_data_segment);

//return previous program break on success,or(void*)-1 on error
void*sbrk(intptr_t increment);

brk将program break设置为参数end_data_segment所指定的位置,由于虚拟内存分配以页为单位,end_data_segment回到下一个内存页的边界处。

sbrk()在原地址上增加参数increment的大小。使用sbrk(0)可以获得program break当前位置。

  增量为正数时,分配内存
  增量为负数时,回收内存

program break的位置抬升以后,程序可以访问新分配区域内的任何内存地址,而此时物理内存页尚未分配,内核会在进程首次试图访问这些虚拟内存地址时自动分配新的物理内存页。

 

 


malloc函数

#include<stdlib.h>
void*malloc(size_t size);

void free(void*ptr);

malloc有以下有点

1.属于C语言的一部分

2.更易于在多线程程序中使用

3.接口简单,允许分配小块内存

4.允许随意释放内存块,他们被维护于一张空闲内存列表中,在后续内存分配调用时循环使用。

 

malloc返回的类型void*,可以赋值给任意类型的C指针。malloc返回内存块是基于8字节或者16字节边界来分配内存的。

一般情况下,free()并不会降低program break的位置,而是将这块内存添加到空闲内存列表中,供后续的malloc函数循环使用。

这么做的原因如下:

1.被释放的内存块通常位于堆的中间,而非堆的顶部,因此降低program break不可能。

2.减少了程序必须执行的sbrk的调用次数。

3.在大多数情况下,降低program break 的位置不会堆那些分配大量内存的程序有多少帮助,因为它们通常倾向于持有已分配内存或是反复释放和重新分配内存,而非释放所有内存后再持续运行一段时间。

 

标签:malloc,sbrk,void,break,program,内存,动态内存,分配
来源: https://www.cnblogs.com/sunmeng1994/p/11468155.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有