软件运行原理 - 内存模型 - 栈内存

说明

  • C/C++软件运行时,内存根据使用方式的不同分为堆内存和栈内存,栈内存使用有以下特征:
  1. 栈内存使用(申请、释放)由系统自动分配和释放,程序员不用做任何操作。
  2. 栈内存重复使用,进入函数时数据入栈,函数执行完数据出栈。
  • 函数中的局部变量以及实参保存在栈内存中。

内存模型

image

  • 栈内存处于进程虚拟内存的高地址,从高往低扩展。
  • 堆内存处于进程虚拟内存的低地址,从低往高扩展。

原理

  • 在数据结构领域,栈是一种仅在尾部进行插入或删除操作的线性表,以后进先出的规则管理数据,先进入的数据被压入栈底,最后的数据在栈顶,压入数据叫做入栈,弹出数据叫做出栈。
  • 函数调用关系也是一种栈的形式,先进后出,第一个函数(main)最后执行完,末端函数最先执行完。
  • 因此使用栈的形式来管理函数调用中的临时内存使用(局部变量等)是非常合适的,而非临时的内存使用则需要通过另外一种方式(堆内存)来管理,所以系统将进程的虚拟内存划分为栈内存和堆内存。
  • 栈内存和堆内存本质上就是一块内存空间,只是不同的使用方式而已,对于编译器就是不同的使用规范。

操作单元

  • 入栈,出栈的操作单元并不是单个变量,而是整个函数,整个函数所需栈内存大小在编译时就能确认,入栈和出栈都是以整个函数需要的栈内存大小为单位一次性扩大/缩小栈内存空间。
  • 以及其它使用考量,例如:函数调用栈回溯等,操作单元不仅仅是函数临时变量(局部变量,实参等)所需的栈内存空间,编译器还会保存一些其它信息,例如:为了解决函数调用栈中间函数跳转问题,需要将LR保存在栈中。
  • 整个操作单元就叫做栈帧。

栈帧(Stack Frame)

  • 每一次函数调用,都会在栈内存上维护一个独立的栈帧(stack frame),栈帧大小是编译时确认的,就是该函数需要占多少栈空间.每个独立的栈帧一般包括:
  1. 函数参数
  2. 临时变量: 包括函数的非静态局部变量以及编译器自动生成的其他临时变量
  3. 函数调用的上下文,例如:帧指针(Frame Pointer)和返回地址(LR)等

入栈、出栈操作

  • 不同平台,函数调用的入栈和函数结束的出栈操作有细微差别,ARMV8平台操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/266446.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode汉化

安装插件 Chinese (Simplified) (简体中文) Language Pack for 重新打开,若还是没有汉化: 【CtrlShiftp】 输入“configure display language”,回车键 选择刚刚安装的 中文(简体)

Oracle(2-15)RMAN Incomplete Recovery

文章目录 一、基础知识1、The Procedure 不完全恢复步骤2、UNTIL TIME Example 基于时间的恢复3、UNTIL SEOUENCE Example 基于序列的恢复 二、基础操作1、不完全恢复准备工作2、不完全恢复开始恢复 RMAN Incomplete Recovery RMAN的不完全恢复 目标: 使用“UNTIL T…

使用MFC实现数据输出真的好方便(C++)

void CMFCApplication1Dlg::OnEnKillfocusEdit1() { //失去焦点就在上部的框显示 CString cont; GetDlgItemTextW(IDC_STATIC2, cont); cont L"你好啊\n"; SetDlgItemTextW(IDC_STATIC2,cont); // TODO: 在此添加控件通知处理程序代码 }

Breach 1.0

靶机环境 该靶机的ip地址配置的是静态IP地址,192..168.110.140 因此我们直接利用仅主机模式,配置为网段192.168.110.0/24网段即可! kali攻击机上配置两个网卡!一个用于访问靶机,另一个网卡适用于出网! 信…

JVM性能调优

遇到以下情况,就需要考虑进行JVM调优了: Heap内存(老年代)持续上涨达到设置的最大内存值; Full GC 次数频繁; GC 停顿时间过长(超过1秒); 应用出现OutOfMemory 等内存异常…

力扣111. 二叉树的最小深度

给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:2 示例 2: 输入…

使用pe安装windows操作系统

一、系统安装前准备工作,制作系统盘 (1)拷贝电脑上的资料 (2)准备一个至少8G的U盘 (3)下载windows镜像文件及pe软件 通过百度网盘可下载下列软件及镜像 windows镜像文件(百度网盘…

Leetcode刷题笔记题解(C++):LCR 121. 寻找目标值 - 二维数组

思路:从左小角或者右上角开始遍历,假设右上角开始遍历,如果当前值大于目标值则列-1;如果当前值小于目标值则行1,以此遍历来查找目标值;注意col和row的选取 class Solution { public:bool findTargetIn2DPl…

Kalman滤波、扩展Kalman滤波、无迹Kalman滤波和异步滤波的原理及其Matlab代码

目录 引言Kalman滤波代码及其结果展示 扩展Kalman滤波代码及其结果展示 无迹Kalman滤波无迹变换无迹Kalman滤波代码及其结果展示 异步无迹Kalman滤波原理代码及其结果展示 引言 本文给出了Kalman Filter(卡尔曼滤波)、Extended Kalman Filter&#xff0…

蓝桥杯Web组学习总结 - 目录导航版

HTML5 HTML 基础标签 HTML5 标签列表 HTML5 新特性 HTML5都有哪些新特性? CSS3 CSS 基础语法 CSS参考手册 盒子模型 CSS Box Model (盒子模型) 浮动与定位?? CSS 浮动(float)与定位(position) CSS布局之浮动和定位 CSS3 新特性 …

高效扫频阻垢装置广谱感应水处理设备介绍工作原理使用参数和选型

​ 1:高效扫频阻垢装置设备介绍 高效扫频阻垢装置是一种通过控制箱释放变频电磁信号,传输到信号放大装置,管道外侧的电磁线圈和电锤产生高频机械振动,在管道和水中传输,通过共振机理破坏水分子之间的氢键,产…

10天玩转Python第2天:python判断语句基础示例全面详解与代码练习

目录 1.课程之前1.1 复习和反馈1.2 作业1.3 今日内容1.4 字符串格式化的补充1.5 运算符1.5.1 逻辑运算符1.5.2 赋值运算符1.5.3 运算符优先 2.判断2.1 if 的基本结构2.1.1 基本语法2.1.2 代码案例2.1.3 练习 2.2 if else 结构2.2.1 基本语法2.2.2 代码案例2.2.3 练习 2.3 if 和…