程序运行时主函数main和其他函数的内存空间是分配到同一个栈,每次程序开始运行时都会创建一个栈,main函数就在栈底,然后通过不同函数的调用顺序,依次进栈出栈。堆是程序动态分配的空间,每次分配的空间不一定是连续的。
- 关于栈内存分配,系统自动分配。在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,一般使用寄存器来存取,效率很高,但是分配的内存容量有限。
- 关于堆内存分配,亦称动态内存分配,根据编写的代码分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete来释放内存。动态内存的生存期由程序员自己决定,使用非常灵活。
最后,编译器一般使用栈来存放函数的参数、局部变量等来实现函数调用。有时候函数有嵌套调用,这个时候栈中会有多个函数的信息,每个函数占用一个连续的区域。一个函数占用的区域被称作帧。同时栈是线程独立的,每个线程都有自己的栈。一个线程只有一个栈,这个线程中执行的所有函数都会用这个栈。函数被调用的时候会在栈顶开辟一部分空间(实质上只是将栈顶上移)保存自己的数据,这些数据就包括函数的参数、返回地址、局部变量。函数返回的时候只要把栈顶回复到被调用前的状态就把它占用的空间释放了。
感谢阅读~



