内存的几大区域
栈内存和堆内存
- 所谓的栈内存和堆内存并不是内存里面有一块区域叫栈,有一块区域叫堆.所谓的栈内存和对内存实际上指的是分配内存的算法不一样,如果是以压栈出栈的方式分配的内存,就叫栈内存.如果是以堆排序的方式分配的内存就叫堆内存
- 堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。
栈内存(stack)
- 栈有2种分配方式:静态分配和动态分配。
- 不过栈的动态分配和堆不同,他的动态分配是由编译器进行释放,无需我们手工实现。
- 栈是一种线性结构
堆内存(heap)
- 堆都是动态分配的,没有静态分配的堆
- 堆内存的动态分配需要手动释放
- 堆是一种链式结构
内存的分配
静态分配
- 静态分配发生在程序编译和连接的时候。
- 静态分配是编译器完成的,比如局部变量的分配。
- 静态分配的内存是在程序一开始运行就会分配内存,直到程序结束了,内存才被释放。
动态分配
- 动态分配则发生在程序调入和执行的时候。
- 动态分配由函数malloc进行分配
- 动态分配的内存是在程序调用在程序中定义的函数时才被分配,函数调用结束了,动态内存就释放。
分配时机
- 栈是编译时分配空间
- 堆是运行时分配空间(动态分配)
访问速度
- 栈是连续存储,是以压栈出栈的方式管理的,在访问的时候只需要移动栈针来分配和销毁内存。栈是程序启动的时候系统事先分配的,使用过程中系统不干预。
- 堆是离散存储,它是以堆排序的方式在堆中寻找合适大小的空闲内存块来分配内存。堆是用的时候才向系统申请的,用完了需要交还,这个申请和交还的过程开销相对比较大。
- 访问的区别: 访问堆的一个具体单元时,需要访问两次内存,第一次取得指针,第二次是真正得数据。而栈只需访问一次。
网友评论