堆和栈

来源:互联网 发布:tgp修复网络环境失败 编辑:程序博客网 时间:2024/06/14 23:34

December 11, 2015 11:46 AM

对于一个进程的内存空间而言,可以在逻辑上分为五个部分:
1) 静态数据区:存放全局、静态变量,初始化的全局、静态变量和未初始化的全局、静态变量在静态数据区的相邻区域
2) 文字常量区:存放字符串常量
3) 代码区:存放函数体的二进制代码
4) 动态数据区-堆,由程序员分配和释放,分配方式类似于链表,
5) 动态数据区-栈,由编译器自动分配和释放,存放函数的参数、局部变量

类型 栈 堆 申请方式 由编译器自动分配和释放 程序员进行申请、释放;如c的malloc和free,c++的new和delete 申请响应 只要栈的剩余空间足够,系统就会为程序提供内存 操作系统有一个记录空闲内存地址的链表,当系统收到内存申请时,会遍历该链表,找到第一个大于申请的堆结点,然后从表中删除该结点,同时记录分配的大小,将剩余的内存重新插入空闲链表中。 申请大小限制 栈向低地址扩展,是一块连续的内存区域,最大容量系统预定(Windows 2Mb) 向高地址扩展,是不连续的内存区域,链式存储,大小受限于有效的虚拟内存区域,相对于栈更加灵活 申请效率 由系统分配,速度快,不可控 速度慢,容易产生内存碎片 存储内容 主要用于函数调用。首先存入函数调用的下一条指令的地址,然后参数从右到左入栈,然后是局部变量,静态变量不入栈 堆存放内容由程序员自由安排 存取效率 快 需要通过指针访问,慢
2 0
原创粉丝点击