主题五 内存管理的艺术----30.内存中的三雄并立
2017-06-15 22:17
232 查看
内存中的三雄并立
程序中的栈
栈是现代计算机程序里最重要的概念之一
栈在程序中用于维护函数调用上下文,没有栈就没有函数,没有局部变量(局部原理)
栈保存了一个函数调用所需要的维护信息
---函数参数,函数返回地址
---局部变量
---函数调用上下文
![](https://img-blog.csdn.net/20170615221824438?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDgwNDMxNw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
程序中的堆
为什么有了栈还需要堆?
栈上的数据在函数返回后就会被释放掉,无法传递到函数外部,如:局部数组。
堆要通过申请才能获得(malloc)
堆是程序中一块巨大的内存空间(几个G)(就是我们经常说的,我的笔记本有4G内存,其中除去操作系统和硬件占用外的部分外,可使用的内存部分),可由程序自由使用。
堆中被程序申请使用的内存在程序主动释放前将一直有效(申请的内存不释放,造成内存泄漏)。
系统对堆空间的管理方式:空闲链表法,位图法,对象池等等。
![](https://img-blog.csdn.net/20170615221857864)
程序中静态存储区
程序静态存储区随着程序的运行而分配空间,直到程序运行结束
在程序的编译期静态存储区的大小就已经确定
程序的静态存储区主要用于保存程序中的全局变量和静态变量
与栈和堆不同,静态存储区的信息最终会保存到可执行程序中(static)
小结
栈,堆和静态存储区是C语言程序中常涉及的三个基本内存区
栈区主要用于函数调用的使用
堆区主要用于内存的动态申请和归还
静态存储区用于保存全局变量和静态变量
程序中的栈
栈是现代计算机程序里最重要的概念之一
栈在程序中用于维护函数调用上下文,没有栈就没有函数,没有局部变量(局部原理)
栈保存了一个函数调用所需要的维护信息
---函数参数,函数返回地址
---局部变量
---函数调用上下文
程序中的堆
为什么有了栈还需要堆?
栈上的数据在函数返回后就会被释放掉,无法传递到函数外部,如:局部数组。
堆要通过申请才能获得(malloc)
堆是程序中一块巨大的内存空间(几个G)(就是我们经常说的,我的笔记本有4G内存,其中除去操作系统和硬件占用外的部分外,可使用的内存部分),可由程序自由使用。
堆中被程序申请使用的内存在程序主动释放前将一直有效(申请的内存不释放,造成内存泄漏)。
系统对堆空间的管理方式:空闲链表法,位图法,对象池等等。
程序中静态存储区
程序静态存储区随着程序的运行而分配空间,直到程序运行结束
在程序的编译期静态存储区的大小就已经确定
程序的静态存储区主要用于保存程序中的全局变量和静态变量
与栈和堆不同,静态存储区的信息最终会保存到可执行程序中(static)
小结
栈,堆和静态存储区是C语言程序中常涉及的三个基本内存区
栈区主要用于函数调用的使用
堆区主要用于内存的动态申请和归还
静态存储区用于保存全局变量和静态变量
相关文章推荐
- 主题五 内存管理的艺术----29.动态内存的分配
- 主题五 内存管理的艺术----32.头疼的野指针
- #内存管理的艺术# 之 Nginx slab的实现 --- 第三篇“基于块的内存分配”
- #内存管理的艺术# 之 Nginx slab的实现 --- 第二篇“基于页的内存分配”
- JVM内存管理:深入垃圾收集器与内存分配策略(一)
- JVM内存管理:深入Java内存区域与OOM、深入垃圾收集器与内存分配策略
- 内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理]
- ZigBee中内存管理(一个内存空间引发的血案)
- Java内存管理:深入Java内存区域管理
- JVM内存管理:深入垃圾收集器与内存分配策略
- 内存管理之bootmem管理之标记内存
- Linux内存管理 —— 内核态和用户态的内存分配方式
- PostgreSQL的内存管理机制三:AllocSet/MemoryContext实例删除和内存回收
- Linux内存描述之概述--Linux内存管理(一)
- JVM内存管理:深入Java内存区域与OOM
- 内存管理(一)java的内存泄露预防
- linux内存管理之活动内存区
- [内存管理]连续内存分配器(CMA)概述
- C++内存分配方式(——选自:C++内存管理技术内幕)
- linux内核高端内存管理之固定内存区与映射