系统中的栈与堆
之前像要用大量数据来测试各种排序算法的效率,但是在main函数内最多只能开辟几万个数的int型数组…借此我去学习了下栈和堆的知识
note:以下均是操作系统里的栈和堆,不是数据结构里面的栈和堆☯。
一.栈(stack)
1.栈用于函数调用时的内存分配,执行期间编译器自动分配和释放。
2.函数调用用于存储:局部变量、函数参数、返回值、返回地址等。
在程序的运行中,栈保存了一个函数调用所需要的维护信息,通常称为栈帧(Stack Frame),其内容如下:
- 函数的返回值和参数
- 临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量
- 保存的上下文:包括函数调用前后需要保持不变的寄存器
栈:高地址 → \rightarrow → 低地址
堆:低地址 → \rightarrow → 高地址
栈指针寄存器%esp 标记栈顶(%esp是一个32位的寄存器,里面存放着最后一个压入栈顶的项的内存地址)
1.参数反序入栈
2.局部变量顺序入栈
二.堆(heap)
1.堆需要人工malloc/new 分配内存 ,再通过free/delete释放内存。
2.堆是动态分配 (即在运行时申请内存)
静态分配:在程序编译和连接时进行内存分配
动态分配:在程序运行阶段进行的内存分配
\qquad
在进程的地址空间中,除了可执行文件、共享库和栈之外。剩余的未分配的空间都可以用来作为堆空间。
\qquad
在malloc中申请的内存,在进程结束会便不会存在。因为当进程结束后,所有与进程相关的资源,包括进程的地址空间、物理内存、打开的文件、网络链接等都被操作系统关闭或者收回、所以无论malloc申请了多少内存,进程结束后都不会存在。
\qquad
malloc申请的空间:如果是指虚拟空间的话,其为连续的,即每次malloc分配后返回的空间都可以看作是一块连续的地址;如果空间是指“物理空间”则并不一定联系,对于一块连续的虚拟空间来说,其可能是由若干个不连续的物理页拼凑而成。
堆与栈的区别
- 申请方式:栈由系统自动分配,而堆是人工分配;
- 申请大小:栈获得的空间较小,而堆获得的空间较大;
- 申请效率:栈由系统自动分配,速度较快,而堆一般速度比较慢;
- 存储内容:栈在函数调用时,函数调用语句的下一条可执行语句的地址第一个进栈,然后函数的各个参数进栈,其中静态变量是不入栈的。而堆一般是在头部用一个字节存放堆的大小,堆中的具体内容是人为安排;
- 底层:栈是连续的空间,而堆是不连续的空间。