详解嵌入式MCU运行时分配的stack和heap

目录

概述

1 认识stack和heap

1.1 栈区(stack)

1.2 堆区(heap)

2 stack和heap的区别

2.1 管理方式的不同

2.2 空间大小不同

2.3 产生碎片不同

2.4 增长方式不同

2.5 分配方式不同

2.6 分配效率不同

3 确定stack和heap空间


概述

本文主要讲述了嵌入式开发中的stack和heap的概念,还详细比较了它们之间的区别,以及在实际应该过程中注意的问题。

1 认识stack和heap

1.1 栈区(stack)

由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。在程序运行的过程中实时的加载和释放。因此,局部变量的生存周期为申请到释放该段栈空间的过程

1.2 堆区(heap)

用于动态内存分配,堆在内存中位于BSS区和栈区之间。一般由程序员分配和释放。对于有内存管理的OS来说,OS会定期回收没有被释放且没有被使用的内存。

在 ANSI C 中可以用 malloc()和 free()两个函数动态地分配内存和释放内存。但是,在嵌入式实时操作系统中,多次这样做会把原来很大的一块连续内存区域,逐渐地分割成许多非常小而且彼此又不相邻的内存区域,也就是内存碎片。由于这些碎片的大量存在,使得程序到后来连非常小的内存也分配不到。 在 4.02 节的任务堆栈中, 我们讲到过用 malloc()函数来分配堆栈时, 曾经讨论过内存碎片的问题。 另外, 由于内存管理算法的原因, malloc()和 free()函数执行时间是不确定的。
 

分配单个堆空间

分配多个堆空间

2 stack和heap的区别

stack是由编译器在程序运行时分配空间区域,由操作系统维护。在C语言中,堆是由malloc()函数分配的内存区,该内存的释放是由free()函数来完成。

stack和heap的区别由如下几点:

2.1 管理方式的不同

stack在程序运行时,由操作系统自动管理,无需程序员手动操作。堆的操作必须有程序员手工操作,否则会出现内存泄漏的情况。

一个stack调用的范例:

2.2 空间大小不同

stack是一个向地址扩展的数据结构,是一块连续的内存区域。即栈顶的地址和栈的最大容量是由系统预先规定好的,当申请的空间超过栈的剩余空间时,将提示溢出,因此,能重栈获得空间大小。

heap是想高地址扩展的数据结构,是不连续的内存区域。系统使用链表来存储空闲的内存地址,而链表遍历方式是从低地址开始,到高地址结束。堆获取内存空间比较灵活。

2.3 产生碎片不同

对heap来说,需要频繁的使用malloc/free来申请或者释放内存,可能会造成内存空间的不连续,从而造成大量的碎片,使得程序运行的效率降低。而stack的空间在程序运行时已经被分配好了。所以,不会出现这样的情况。

2.4 增长方式不同

heap的增长方式是向上的,朝着内存地址增加的方向增长

stack的增长方式是向下的,即朝着内存地址减少的方向增长

2.5 分配方式不同

heap都是由malloc/free来申请或者释放内存。stack的申请和释放是由操作系统自动完成的。

stack的动态分配是由alloca()函数来完成的,但其释放是由操作系统自动完成的。

2.6 分配效率不同

stack是系统提供的数据结构,操作系统会在底层对其提供支持,分配专门的寄存器存放栈的地址,压栈和出栈都有专门的指令执行,堆是由C函数库提供的。堆的操作由一整套算法来寻找内存空间,所以,堆的分配效率和栈相比会低很多。

3 确定stack和heap空间

Step -1:  在初始化时,将栈空间全部初始化一个固定数据0x5a

step -2:  初始化完成后,程序可以正常使用堆栈,由于程序会忘栈中压入新的数据,这将覆盖原来的数据0x5a

step - 3: 程序在运行的过程中,堆栈中的数据会起起落落的变化,最终在程序运行完成时,会有一个最大的栈空间。这个最大的栈空间是程序所需要最大的栈空间

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

架构师:搭建Spring Security、OAuth2和JWT 的安全认证框架

1、简述 Spring Security 是 Spring 生态系统中的一个强大的安全框架,用于实现身份验证和授权。结合 OAuth2 和 JWT 技术,可以构建一个安全可靠的认证体系,本文将介绍如何在 Spring Boot 中配置并使用这三种技术实现安全认证,并分析它们的优点。 2、Spring Security Spri…

Linux基础04-Linux中目录和文件都能操作的命令

前面两节我们分别学习了目录操作命令和文件操作命令,那么有没有一些既可以操作目录,又可以操作文件的命令呢? 这样我们就不需要记住两套命令了。 其实还真有,今天这一章就带大家学习Linux中目录和文件都能操作的命令 最近无意间获…

深度学习之DCGAN

目录 须知 转置卷积 DCGAN 什么是DCGAN 生成器代码 判别器代码 补充知识 LeakyReLU(x) torch.nn.Dropout torch.nn.Dropout2d DCGAN完整代码 运行结果 图形显示 须知 在讲解DCGAN之前我们首先要了解转置卷积和GAN 关于GAN在这片博客中已经很…

GraphGPT——图结构数据的新语言模型

在人工智能的浪潮中,图神经网络(GNNs)已经成为理解和分析图结构数据的强大工具。然而,GNNs在面对未标记数据时,其泛化能力往往受限。为了突破这一局限,研究者们提出了GraphGPT,这是一种为大语言…

ASP.NET MVC(二) HtmlHelper

强类型 》》》 Form Html.Action() 执行一个Action,并返回html字符串。 Html.ActionLink() 生成一个超链接。 》》》 htmlhelper 扩展方法 /// 扩展方法 三要素 静态类静态方法this 》》》》上面需要引入命名空间, 》》》 不需要引入命名空间 pu…

每日OJ题_DFS解决FloodFill⑥_力扣529. 扫雷游戏

目录 力扣529. 扫雷游戏 解析代码 力扣529. 扫雷游戏 529. 扫雷游戏 难度 中等 让我们一起来玩扫雷游戏! 给你一个大小为 m x n 二维字符矩阵 board ,表示扫雷游戏的盘面,其中: M 代表一个 未挖出的 地雷,E 代表…

计算机系列之数据库技术

13、数据库技术(重点、考点) 1、三级模式-两级映像(考点) 内模式:管理如何存储物理的数据,对应具体物理存储文件。 **模式:**又称为概念模式,就是我们通常使用的基本表&#xff0c…

AquiSense实现UV-C发光二极管里程碑

国际空间站饮水机上使用的UV-C LED技术 紫外线LED水消毒系统制造商AquiSense Technologies宣布,该公司的UV-C LED技术已成功集成到美国国家航空航天局(NASA)国际空间站(ISS)上的饮用水分配器中,并自2023年8…

【Git】回滚旧提交版本且不影响最新提交版本

【Git】回滚旧提交版本且不影响最新提交版本 一、场景假设 远程仓库origin中有一个分支main,有4次提交记录:v1、v2、v3、v4。 二、需求 需要回滚旧提交版本,但不影响已有的所有提交版本(即不影响最新提交版本)&…

树和二叉树:二叉树的基本运算算法的实现

一.前言 当前版本仅供笔者复盘 二.二叉树 2.1题目 编写一个程序,实现二叉树的基本运算,具体要求如下:(指定示范实例1:图1。指定示范实例2:图2 ) 1,先序遍历输出该树&#xff08…

PWM 开发舵机SG90-硬件舵机实战

1.PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节…

hadoop学习---基于Hive的数仓搭建增量信息拉链表的实现

拉链表就是SCD2,它的优点是即满足了反应数据的历史状态,又能在最大程度上节省存储。 拉链表的实现需要在原始字段基础上增加两个新字段: start_time(表示该条记录的生命周期开始时间——周期快照时的状态)end_time(该条记录的生命周期结束时…

JSP合同信息管理系统参考论文(论文 + 源码)

【免费】JSP合同信息管理系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89273651JSP合同信息管理系统 摘要 随着信息科学技术的飞速发展,人们逐渐意识到对信息管理软件的运用可以使日常工作更加方便、快捷和高效。论文详细论述了公司合同管理系…

Mysql 8.0 -- 最新版本安装(保姆级教程)

Mysql 8.0 -- 最新版本安装(保姆级教程) ​​ 一,下载Mysql数据库: 官网链接:https://www.mysql.com/downloads/ 二,安装Mysql: 三,找到Mysql安装目录: 找到mysql安装目录&#xf…

在k8s中安装Grafana并对接Prometheus,实现k8s集群监控数据的展示

🐇明明跟你说过:个人主页 🏅个人专栏:《Grafana:让数据说话的魔术师》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Grafana简介 2、Grafana的重要性与影响力 …

C进阶--自定义类型

自定义类型 1. 结构体1.1. 结构的基本知识1.2 结构的声明1.3 特殊的声明1.4 结构的自引用1.5 结构体变量的定义和初始化1.6 结构体内存对齐结构体的大小练习结构体对齐规则为什么存在内存对齐? 1.7 修改默认对齐数1.8 结构体传参 2. 位段2.1 什么是位段2.2 位段的内存分配2.3 …

MWeb Pro for Mac:功能强大的Markdown博客编辑器

MWeb Pro for Mac是一款功能强大的Markdown博客编辑器,专为Mac用户设计,提供了一站式的博客写作和发布体验。这款软件不仅支持Markdown语法,还提供了丰富的编辑和排版功能,让用户能够轻松创建出精美的博客内容。 MWeb Pro的即时预…

笔试强训Day16 字符串 基础算法 双指针

QR6 字符串替换 题目链接&#xff1a;字符串替换_牛客题霸_牛客网 (nowcoder.com) 思路&#xff1a;简单的字符串操作。 AC code&#xff1a; class StringFormat { public:string formatString(string A, int n, vector<char> arg, int m) {string ans;int pos 0;f…

【Qt】按钮类控件

文章目录 1 :peach:Push Button:peach:2 :peach:Radio Buttion:peach:3 :peach:Check Box:peach:4 :peach:Tool Button:peach: 1 &#x1f351;Push Button&#x1f351; 使⽤ QPushButton 表⽰⼀个按钮&#xff0c;这也是当前我们最熟悉的⼀个控件了&#xff0c;QPushButton …

论文阅读:《Sequence can Secretly Tell You What to Discard》,减少推理阶段的 kv cache

目前各类大模型都支持长文本&#xff0c;例如 kimi chat 以及 gemini pro&#xff0c;都支持 100K 以及更高的上下文长度。但越长的上下文&#xff0c;在推理过程中需要存储的 kv cache 也越多。假设&#xff0c;数据的批次用 b 表示&#xff0c;输入序列的长度仍然用 s 表示&a…