C/C++内存管理
来源:互联网 发布:手机拍摄软件 编辑:程序博客网 时间:2024/06/07 02:42
1、堆栈
想要清楚分析内存管理机制,堆和栈的不可避免要讨论的问题,首先要理清数据结构中的栈和堆和内存分配中的栈和堆,他们是不一样的概念!
数据结构的栈和堆
栈就像存放数据的桶,他是一种具有后进先出性质的数据结构堆是一种经过排序的树形数据结构,通过所说的堆的数据结构,是指二叉堆。
内存分配中的栈和堆
(1、)概念栈:由编译器自动分配释放,存放函数的参数值,局部变量。操作方式类似于数据结构中的栈。
堆:一般有程序员分配释放,若程序员不释放,则可能会引起内存泄漏。和数据结构中的堆栈不一样,类似于链表。
(2、)申请大小
栈:栈的大小是固定。由系统分配。的是一块连续的内存区域,如果申请空间超过栈的剩余空间时,将会提示overflow。
堆:堆是不连续的内存区域,这是有系统使用链表来存储空闲内存地址的,自然是不连续的。堆的大小受限于计算机中有效的虚拟内存。
(3、)分配方式
栈:有两种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配有alloca函数进行分配,但是栈的动态分配和堆是不同的,栈的动态分配由编译器实现,无需手动实现。而堆需要手动释放。
堆:都是动态分配,没有静态分配。
对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。
动态数据区一般就是“堆栈”。“栈(stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。
静态数据区——全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。
(4、)存储内容
栈:在函数调用的时候,第一个进栈的是主函数中后的下一条语句地址。然后是函数的各个参数,参数是由右往左入栈的,然后是函数的局部变量。函数调用后局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址。也就是主函数的下一条指令,程序由该点继续执行。
堆:一般是在堆的头部用一个字节存放堆的大小。
- 【C/C++】C++内存管理
- C/C++ 内存管理
- C内存管理函数
- C内存管理
- C内存管理
- object c 内存管理
- C 内存管理详解
- C 内存管理
- C语言内存管理
- c/c++内存管理
- c 的内存管理
- C内存管理
- Ojbective-c 内存管理
- C内存管理
- objective-c内存管理
- Objective-c 内存管理
- Objective-C内存管理~~
- c,c++内存管理
- python random学习
- String、StringBuffer与StringBuilder之间区别
- go 语言学习历程
- 看好你的门-客户端传数据(3)附录-http信息头说明
- 基于HTML+JS的灵活、可扩展的桌面软件架构
- C/C++内存管理
- 基于Socket上传客户端
- 设计模式-适配器模式
- ubuntu 12.04搭建tftp服务器的安装、设置、调试
- 编程语言的选择原则
- mysql 性能调优
- Spark Streaming容错的改进和零数据丢失
- 路遥短篇小说之《匆匆过客》
- Restrictions HQL运算符对应