堆 栈 及其内存分配

keil5编程前的工程文件配置,芯片型号支持包配置,用户文件配置,启动文件配置和库函数配置-江科大stm32学习 第一天 1.start文件夹中头文件需要配置路径path,另外user和library也需要,都是同样的操作。如图,在option界面c/c++中,在倒数第二空行的三个点处添加。2.需要设置一个宏,作用是使主函数头文件包含标准库函数,操作如图:复制头文件中8296行的字符串,在option界面的c/c++中第一行define粘贴这个字符串即可。一、首先,下载芯片支持包,选择你自己的器件型号,不懂的可以看我这篇选器件的方法(默认已经注册好用户)点击编译按钮,编译成功后即可在user文件夹里添加main.c正常使用。 阅读详情

一 分配与释放  http://blog.youkuaiyun.com/hairetz/article/details/4141043


1 堆(heap): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

堆则是存放在 二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来    得低一些
     从堆heap或者自由存储空间上分配,称之为动态内存分配。 程序在运行期间用malloc()或new申请任意数量的内存,程序员自己掌握释放内存的恰    当时机(使用free或者delete)。动态内存的生存周期由程序员决定。

2 栈(stack): 存放函数的参数值,局部变量的值等   。函数执行期间,函数内局部变量,包括形参的存储单元都创建在栈上,函数结束时自动释放。       栈的内存分配运算内置在处理器的指令集中,效率很高,并且一般不存在失败的风险,但是分配的内存容量有限,容易溢出。

由 编译器自动分配释放 ,。其操作方式类似于数据结构中的栈
栈使用的是 一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放


3 全局区(静态区static) :内存在编译时候就已经分配好了,这些内存在程序的整个运行期间都存在。   全局变量和静态变量的存储是放在一块的,初始化的 全局变        量和静态变量在一块区域,   未初始化的全局变量和未初始化的静态          变量在相邻的另  一块区域。   -   程序结束后由系统释放。 


4 程序代码区—存放函数体的二进制代码。 

5 文字常量区   —常量字符串就是放在这里的。   程序结束后由系统释放  http://www.360doc.com/content/12/0221/11/255982_188281677.shtml

5_1 常量区  http://www.embedu.org/Column/Column540.htm

6 从堆heap或者自由存储空间上分配,称之为动态内存分配。 程序在运行期间用malloc()或new申请任意数量的内存,程序员自己掌握释放内存的恰当时机(使用free或者delete)。动态内存的生存周期由程序员决定。


区别和联系:http://www.zhihu.com/question/19729973  
1.申请方式
堆是由程序员自己申请并指明大小,在c中malloc函数 如p1 = (char *)malloc(10);
栈由系统自动分配,如声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
2.申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会 遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内 存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大 小,系统会自动的将多余的那部分重新放入空闲链表中。
3.申请大小的限制
栈:在Windows下,栈是向低地址扩展的数据结 构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是 一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
4.申请效率的比较:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.

体会:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

PCL1.12.1+VTK9.1+Qt5.14.2实战:解决QVTKOpenGLNativeWidget点云渲染窗口初始化报错问题 本文针对PCL1.12.1、VTK9.1与Qt5.14.2集成开发中,QVTKOpenGLNativeWidget点云渲染窗口初始化时出现的报错与黑屏问题,提供了深度分析与两种实战解决方案。核心在于理解VTK版本升级导致的渲染窗口类型不匹配,并指导开发者通过显式创建vtkGenericOpenGLRenderWindow或利用窗口ID嵌入,正确初始化并绑定可视化组件,从而稳定实现点云渲染。 阅读详情

相关推荐

Windows升级保留个人文件和应用灰色?改注册表版本指纹

Windows 升级安装并非简单跳过下一步,安装程序会先读取注册表中 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion 下的 EditionID、ProductName、CompositionEditionID 等版本指纹,与目标镜像 install.wim/esd 记录的版本类型做双向匹配。若当前系统被识别为 LTSC、精简版或跨版本降级,兼容性扫描会判定升级路径不可用,于是“保留个人文件和应用”变灰,只能全新安装。理解版本指纹与升级可行性表的匹配机制,可

weixin_31986143的博客 372

在栈(stack)上动态分配内存的一种简单实现方式

有时候为了代码的高效性,需要在stack上分配内存。一般而言如果不通过额外的寄存器,只通过esp指针是没法实现在stack的上的内存的动态分配的,因为compile没法通过单纯一个esp指针来实现变量的相对地址的管理。 例如要实现如下类似函数: int foo(int n){    int x=100; // assume its not put in a regis

我的奋斗@2011之移动互联网 2124

数学之美 | 图论和网络爬虫

文章目录概述图论网络爬虫分析BFSDFSBFS + DFS参考资料 概述 这篇文章主要给大家介绍一下计算机算法中非常重要的一部分——图论,以及它在生活中的应用——网络爬虫。   图论 离散数学是当代数学的一个重要的分支,也是计算机科学的数学基础。它又包括四个分支,而图论便是其中一支,另外三个分别是:数理逻辑、集合论、近代数学。 图论中的图由一些节点和边构成,比如下面这张图 。 在图论中一个很基础...

小小酥梨的博客 3231

堆和栈的内存分配

堆和栈的内存分配堆和栈的区别栈(stack):堆(heap) 堆和栈的区别 栈(stack): stack 用于静态分配内存,内存分配发生在连续的内存上。在栈上分配内存,首先编译器要知道分配的内存的大小,没当函数调用时,其变量都会在stack上分配内存。每当函数调用结束时,变量分配的内存就会被释放。这个过程在编译器内有一定的预设,一般来说,程序员不需要考虑内存的分配和释放过程。在stack上分配内存的方式成为临时内存分配,因一旦程序完成执行,该程序使用的所有数据都会在stack中被刷新。 这是一种临时的内

auteman_dan的博客 2276

BDD测试之Behave使用入门

BDD测试(Behavior-Driven Development Testing)是一种基于“行为驱动开发”(BDD)理念。

想要成为酷盖但是失败的小明 580

基于车牌识别的停车收费系统的设计与实现(源码+开题)

本系统(程序源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景: 随着城市化进程的加速和汽车保有量的增加,停车难成为了一个普遍存在的问题。传统的停车收费方式存在着效率低下、管理混乱等问题。因此,开发一款基于车牌识别的停车收费系统具有重要的现实意义。研究意义: 基于车牌识别的停车收费系统可以有效地解决传统停车收费方式在效率和准确性方面的问题,提高停车服务的效率和质量。

迟限程序设计 1392

设置栈内存大小

我们可以使用参数 -Xss选项来设置线程的最大栈空间,栈的大小直接决定了函数调用的最大可达深度 -Xss1m -Xss1k public class StackDeepTest{ private static int count=0; public static void recursion(){ count++; recursion(); } public static void main(String args[]){

Leon_Jinhai_Sun的博客 1248

一代测序、二代测序以及三代测序的优缺点及应用对比?

一、初现庐山真面目 一代测序:又称Sanger测序(多分子,单克隆) 历史:第一代DNA测序技术(又称Sanger测序)在1975年,由Sanger等人开创,并在1977年完成第一个基因组序列(噬菌体X174),全长5375个碱基。研究人员经过30年的实践并对技术及测序策略的不断改进(如使用了不同策略的作图法、鸟枪法),2001年完成的首个人类基因组图谱就是以改进了的Sanger法为其测序基础。 原理:在4个DNA合成反应体系(含dNTP)中分别加入一定比例带有标记的ddNTP(分为:ddATP...

wangprince2017 3万+

java 三级缓存_技术汇总:第十三章:三级缓存

一级缓存栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;二级缓存堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收),所以调用这些对象的速度要相对来得低一些。三级缓存三级缓存指的是:内存缓存、本地缓存、网络缓存。其各自的特点是内存缓存速度快, 优先读取,本地缓存速度其次, 内存没有,读本地,网络缓存速度最慢, 本地也没有,才访问...

weixin_39667652的博客 1802

PCL 点云配准-ICP算法(精配准)

ICP(Iterative Closest Point)算法是一种常用的点云精细配准算法。它通过迭代计算将一组点云变换到另一组点云的最佳位置,最终实现精确的对齐。ICP算法在每次迭代中选择与目标点云最接近的点作为对应点,通过计算最小化源点云和目标点云之间的均方误差(MSE)来进行刚性变换(包括平移和旋转)。

纵马踏花向自由 1725

基于Simulink环境,提供一个关于如何对DC-DC变换器进行效率分析的仿真建模

效率定义:变换器效率通常定义为输出功率与输入功率之比,即 η=PoutPinη=Pin​Pout​​。重要性:高效率意味着更少的能量损失和更好的热管理,对于便携式设备、电动汽车等应用至关重要。挑战开关损耗:高频操作带来的开关器件损耗。导通损耗:电流流过电阻性元件(如MOSFET导通电阻)造成的能量损失。控制策略:优化控制算法以减少损耗。首先明确要模拟的任务内容。设计一个能够支持特定输入输出电压比的DC-DC变换器。根据工作频率和谐振元件值确定合适的电路参数。

xiaoheshang_123的博客 156

C语言笔试题纪录(二)

静态链表中指针表示的是(B) A . 内存地址 B . 数组下标 C .下一元素地址 D . 左、右孩子地址 下述对线程说法错误的是(D) A.线程是进程的一部分 B.使用线程有利于提高程序执行效率 C.线程切换开销比进程切换开销低 D.线程间不能共享全局变量 进程是由多个线程组成,同一个进程的线程能共享全局变量 以下关于TCP协议特点的描述中,错误的是(C) A.TCP协议是一种

yty19970212的博客 387

2025年09月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析

2025年09月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析

伶俐角少儿编程 639

C++的程序内存分配方式:堆与栈及其区别

一、首先要区分数据结构中的堆、栈与内存中的堆、栈1、数据结构中的堆与栈        栈:是一种连续储存的数据结构,具有先进后出的性质。通常的操作有入栈(圧栈)、出栈和栈顶元素。想要读取栈中的某个元素,就要将其之前的所有元素出栈才能完成。类比现实中的箱子一样。        堆:是一种非连续的树形储存数据结构,每个节点有一个值,整棵树是经过排序的。特点是根结点的值最小(或最大),且根结点的两个子树...

xzsfg6825的博客 1743

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

堆 栈 程序 内存分配 详解

 堆和栈的区别一、预备知识—程序的内存分配    一个由c/C++编译的程序占用的内存分为以下几个部分    1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。    2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 

SearchLife的专栏 1705

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java内存分配(堆,栈,方法区,常量池)图解

初学内存空间的分配,不足的地方还请大佬们多担待与指点

m0_57816620的博客 8861

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java中的堆和栈

转自:http://blog.youkuaiyun.com/jwj179049572/archive/2006/09/28/1298000.aspx2.1 内存分配策略按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的.静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据

Day day up! 925

java面试 数据结构和内存中堆和栈的区别

堆(heap)和栈(stack)的区别 1、存储 栈:变量、对象的引用 堆:实例对象 2、速度 栈:存取速度快 堆:存取速度慢 3、线程访问 栈:每个线程都有一个栈区 堆:所有线程共享一个堆区 4、垃圾回收 栈:比较频繁 堆:不频繁 详情: 栈内存:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能...

weixin_44026997的博客 1506

java中栈和堆_认识java中的堆和栈

栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和 multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行...

weixin_34244326的博客 102

让你彻底明白JAVA中堆与栈的区别

Java中堆与栈的区别 简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。      堆内存用来存放由new创建的对象和数组。

WILLIAM-HUAN 个人技术博客 1万+

java中内存分配策略及堆和栈的比较

2.1 内存分配策略  按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的.  静态存储分配是指在编译时就能确定每个数据 目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在, 也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求.

踏雁寻花 856

c++五种内存分配、堆与栈区别

在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。     栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。     堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序

逐梦科学 8146

堆变量和栈变量

全局,静态,new产生的变量都在堆中动态分配的变量在堆中分配     局部变量在栈里分配函数中声明的变量在栈中     用了new标示符在堆中     全局变量和static变量都在全局区程序为栈变量分配动态内存,在程序结束时为栈变量分配的空间将自动释放;而为堆变量分配的空间则不会自动释放,若在程序中没有没有释放堆变量,它将一直占用系统内存。 堆栈是一种执行“后进先出”算法的数据结构。

zhubo22的专栏 1019

Java中堆和栈的区别

与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。       Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和 multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因

编程,哲学和诗歌~~~~~ 339

堆和栈最通俗的_堆和栈的区别详解

前言:在程序设计的时候、堆栈总是不可避免的会接触到、而对于堆和栈他们的区别、在程序运行时各自的作用,如何利用堆栈提高运行效率等很多人都还了解的不够,今天google了很多文章,所以在这里作个完善总结,希望能给有心人些帮助。有不足的地方还希望能指出。栈是随函数被调用时分配的空间栈上分配的空间是临时的,在函数退出后将被系统释放,不会造成内存泄露,不得用delete或free操作,因为栈的空间小所以在栈...

weixin_29189003的博客 950

java堆区和栈区区别_[整理] 浅谈堆、栈、堆区、栈区的概念和区别

一、区别堆和栈可以分为两种,一种是数据结构,另一种是和内存的分配有关,这两种虽然都有栈和堆,但是两者关系并不大;1、栈、堆是数据结构里面的叫法;注意:有时候有人喜欢这样说 "堆栈" 其实说的就是栈而不是堆。2、堆区、栈区则是内存模型的叫法。二、内存中的栈区和堆区而C语言的内存模型分为5个区:栈区、堆区、静态区、常量区、代码区。每个区存储的内容如下:1、栈区:存放函数的参数值、局部变量等,由编译器自...

weixin_39864373的博客 504
上一篇: 卷积神经网络学习
下一篇: Const,Const函数,Const变量,函数后面的Const (zz)
againd
博客等级 码龄15年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值