栈和堆的区别

程序内存分区中的栈和堆

1、栈简介

1) 栈由操作系统分配,用于存放函数的参数值,局部变量等等。

2)内存地址生长方向自上向下 比如

int main() {
   
	int a;				//栈
	int b; 	            //栈
	int c;			    //栈
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/52ecdeb3bd2e47d799006edde546316c.pn

这里b的地址小于变量a的地址,即后定义的变量地址低于先定义的变量。
3)栈中存储数据的生命周期随着函数的执行完成而结束。

2、堆简介

1)堆由开发人员分配和释放。
2)分配方式类似链表。
3)堆的内存地址由低到高。
4)若先前内存被释放,后面的内存则会利用先前的内存,所以后申请的内存空间并不一定在先申请内存空间的后面。
5)如果堆中的数据没有释放,其生命周期等同于程序的生命周期。

3、堆和栈的区别

1)管理方式不同。
栈由操作系统自动分配,堆需要我们主动释放,要不然容易产生内存泄露问题。
2)空间大小不同。
栈的大小远远小于堆大小。
3)生长方向不同。
栈生长方向向下,内存地址由高到低。
堆生长方向向上,内存地址由低到高。
4)分配方式不同。
堆:动态分配。
栈:既有静态分配(由操作系统分配)也有动态分配(alloca()函数分配,栈的动态分配的内存由操作系统自动释放)
5)分配效率不同
硬件层级会对栈提供支持:分配专门的寄存器来存放栈的地址,压栈出栈都有专门的指令执行,决定了栈的效率比堆高。
堆是由库函数或者运算符来向内存申请的内存空间。效率比栈低。
6)存放内容不同。
堆:一般堆顶使用一个空字节来存放堆的大小,而堆中的内容由程序员自己决定。
栈:函数返回地址,相关参数,局部变量,寄存器内容等。

栈中调用函数的过程

1)参数传递
调用者将函数参数压入栈中或者通过寄存器传递。
2保存上下文
保存当前函数的执行状态,例如保存寄存器中的值。以便在函数返回后能够恢复到调用前的状态。
3)跳转至被调用函数
将控制权转移至被调用函数的起始位置,被调用函数执行前,需要为其分配内存空间来存储局部变量和临时数据。
4)局部变量和临时数据
局部变量和临时数据存储在栈上。(静态变量不是栈而是存放在数据段或者是BSS段)。
6)返回地址
将返回值存放在指定的寄存器或内存位置。函数执行完毕后,会通过返回地址找到调用该函数的指令,从而返回到调用者的位置。
7)恢复上下文
调用者会从栈中恢复之前保存的上下文信息,调用者就能够继续执行,同时也可以获得被调用函数的返回值。
在这里插入图片描述
出栈过程:执行恢复上下文,将栈顶指针指向原来位置。

相关推荐

  1. 区别

    2023-12-28 21:30:01       53 阅读
  2. 【数据结构】区别

    2023-12-28 21:30:01       43 阅读
  3. 【C++】C++中介绍区别

    2023-12-28 21:30:01       26 阅读
  4. C语言区别是什么?

    2023-12-28 21:30:01       26 阅读
  5. C++中内存定义以及区别

    2023-12-28 21:30:01       29 阅读
  6. JVM中

    2023-12-28 21:30:01       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-28 21:30:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-28 21:30:01       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-28 21:30:01       82 阅读
  4. Python语言-面向对象

    2023-12-28 21:30:01       91 阅读

热门阅读

  1. Linux 命令

    2023-12-28 21:30:01       52 阅读
  2. 常见的hooks

    2023-12-28 21:30:01       58 阅读
  3. 三路归并排序可视化

    2023-12-28 21:30:01       55 阅读
  4. 算法训练营Day29(回溯)

    2023-12-28 21:30:01       61 阅读
  5. 阿里控股 面经

    2023-12-28 21:30:01       60 阅读
  6. 快速排序回顾及相关题型

    2023-12-28 21:30:01       60 阅读
  7. 72 DFS解决目标和问题

    2023-12-28 21:30:01       51 阅读
  8. 进程

    进程

    2023-12-28 21:30:01      50 阅读
  9. nginx部署前端项目总结

    2023-12-28 21:30:01       67 阅读
  10. C++_静态成员变量介绍

    2023-12-28 21:30:01       51 阅读
  11. MOS和三极管

    2023-12-28 21:30:01       56 阅读