堆和栈的区别

【WB32库开发】第9章 TIM1高级定时器——输出多路PWM PWM(Pulse Width Modulation)意为脉冲宽度调制,简称脉宽调制 。在工控行业,PWM信号可以用来调节电机转速、调节变频器以及BLDC电机驱动等;在LED照明行业,可以通过PWM来控制LED的亮暗变化;还可以通过PWM信号来控制无源蜂鸣器发出简单的声音等。 WB32也可输出PWM,需配置WB32上的定时器。 在WB32中有4个定时器,其中TIM1为高级定时器,TIMx(2-4)为通用定时器,这四个定时器均挂载在APB1总线上,每个定时器都可以输出4路PWM。 本章需要使用固件库TIM例程 阅读详情
在bbs上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。
    首先,我们举一个例子:
    void f() { int* p=new int[5]; } 
    这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中,他在VC6下的汇编代码如下:
    00401028   push        14h
    0040102A   call        operator new (00401060)
    0040102F   add         esp,4
    00401032   mov         dword ptr [ebp-8],eax
    00401035   mov         eax,dword ptr [ebp-8]
    00401038   mov         dword ptr [ebp-4],eax
    这里,我们为了简单并没有释放内存,那么该怎么去释放呢?是delete p么?澳,错了,应该是delete []p,这是为了告诉编译器:我删除的是一个数组,VC6就会根据相应的Cookie信息去进行释放内存的工作。
    好了,我们回到我们的主题:堆和栈究竟有什么区别? 
    主要的区别由以下几点:
    1、管理方式不同;
    2、空间大小不同;
    3、能否产生碎片不同;
    4、生长方向不同;
    5、分配方式不同;
    6、分配效率不同;
    管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。
    空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改:    
    打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。
注意:reserve最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。
    碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。
    生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。
    分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
    分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。
    从这里我们可以看到,堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。
    虽然栈有如此众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。
    无论是堆还是栈,都要防止越界现象的发生(除非你是故意使其越界),因为越界的结果要么是程序崩溃,要么是摧毁程序的堆、栈结构,产生以想不到的结果,就算是在你的程序运行过程中,没有发生上面的问题,你还是要小心,说不定什么时候就崩掉,那时候debug可是相当困难的:)
    对了,还有一件事,如果有人把堆栈合起来说,那它的意思是栈,可不是堆,呵呵,清楚了?
Altium Designer应用技巧13: 四层板的拼版方法 本文介绍在Altium Designer中,进行4层板的拼版方法。Altium Designer有多种拼版方法,本文选择最直观的复制、删帖方法来完成,步骤如下: 1、看一下原始文件,如下图所示,我们要对该板进行拼版操作。 2、通过菜单“报告”-“板子信息”得到板子大小,在这里一般切换为mm比较好操作,我们可以使用快捷键"q"。 3、如果是水平拼版,我们需要关心水平长度;如果是垂直拼版... 阅读详情

相关推荐

【论文阅读】High-Resolution Image Synthesis with Latent Diffusion Models

为了降低训练扩散模型的算力,LDMs使用一个Autoencoder去学习能尽量表达原始image space的低维空间表达(latent embedding),大大减少需要的算力。在RGB空间:编码器encoder:,将x压缩成低维表示解码器decoder: D,将低维表示z还原成原始图像空间。1. 加入Autoencoder(上图中左侧红色部分),使得扩散过程在latent space下,提高图像生成的效率;

weixin_57974242的博客 1万+

嵌入式开发中的堆与栈

关注、星标公众号,直达精彩内容文章内容出处:网路素材整理:李肖遥0.前言堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义:(1)程序内存布局场景下,堆与栈表示两种内存管理方式;(2)数据结构场景下,堆与栈表示两种常用的数据结构。1.程序内存分区中的堆...

李肖遥的专栏 5627

AVS3代码阅读HPM4.0

参考AVS3代码阅读(HPM6.0)(一.整体架构以及CU划分部分代码) 版本:HPM4.0 核心文件:app_encoder.c   要做的是帧间预测,所以前面的函数先暂时不管了,挖个坑以后再填。直接从enc_pic看起。 enc_pic()    ...

CRR的博客 3187

堆、栈,它们到底是什么?看完这篇文章你就明白了!

特征堆栈定义程序运行时自由存储的内存空间由操作系统自动分配和管理的内存空间管理方式由程序员手动进行分配和释放自动分配和管理内存大小空间较大,动态申请和释放由操作系统指定大小,固定存储方式存储动态分配的对象和复杂数据结构存储基本数据类型和引用类型的地址,用于存储函数调用栈、内存的分配操作、表达式求值的临时变量以及与程序中的控制流相关的数据应用用于动态分配和管理内存,例如创建对象、数组等用于存储函数调用栈、临时变量等优缺点空间较大,但由程序员管理,容易发生内存泄漏或溢出。

青轩桃李能几何,流光欺人忽蹉跎 3万+

ComfyUI全自动换装工作流:从零到一的实战指南

本文提供了一份详细的ComfyUI全自动换装工作流实战指南。从环境配置、模型准备到核心工作流架构的逐步拆解,手把手教你搭建一条高效的AI换装流水线。文章深入解析了从输入、预处理、融合到输出的四步核心逻辑,并分享了关键参数调优与进阶技巧,旨在帮助电商从业者、内容创作者及AI爱好者轻松实现高质量、高效率的“一键换装”。

weixin_29198045的博客 895

睿思综述智能体:100篇高质量文献一键生成万字长文,还能联网PubMed,科研效率拉满!

对一个主题进行文献综述,是日常科研人绕不过去的工作,无论是写论文前言,综述论文,或者基金申请书的立项依据,需要根据主题,从海量文献中提取相关信息,梳理出清晰的逻辑线,再组织成流畅的文字。4 一键生成万字全文:大纲确认后,它会基于对所有论文的深度理解,逐个章节进行详细撰写,最终生成一篇逻辑连贯、内容翔实、引用规范的万字综述长文,并直接保存为Word(.docx)文件。3 智能撰写大纲:你可以提供自己的大纲,也可以让它根据所有文献内容,智能生成一个逻辑清晰的综述大纲,并支持你在此基础上修改。

dinaxuejie的博客 821

堆和栈的区别(示例代码)

堆和栈是计算机内存管理中两个重要的概念,它们在内存分配和存储方式上有很大的不同

xxiaobaibaibai的博客 3026

零基础入门生信转录组数据分析——导读

转录组数据分析(上游,下游,数据可视化)专栏的目录,可以直接通过点击各个分析点直接跳转到相关帖子,方便查找和观看

呆猪儿的博客 1万+

堆区和栈区的区别

1、栈是限定仅仅在表尾进行插入和删除操作的线性表,把允许插入和删除的一端称之为栈顶,另外一端称之为栈底。特点:后进先出,称之为后进先出线性表。 2、是一种经过排序的树形数据结构,每一个节点都有一个值,通常所说堆的数据结构是二叉树,堆的存取是随意的。所以堆在数据结构中通常可以被看做是一棵树的数组对象。 注:首先堆和栈可以分为两种,一种是数据结构,另一种是和内存的分配有关,这两种虽然都有栈和堆,但是两者关系并不大,栈、堆是数据结构里面的叫法,注意:有时候有人喜欢这样说 “堆栈” 其实说的就是栈而不是堆。堆区、栈

qq_45611002的博客 9900

matlab 计算点云粗糙度

A Correspondence Framework for ALS Strip Adjustments based on Variants of the ICP Algorithm

点云侠的博客 1828

基于Python的船舶AIS数据爬取与分析:从数据采集到可视化实战

本文详细介绍了如何使用Python构建一个完整的船舶AIS数据爬取与分析系统。文章从AIS系统的基本原理讲起,逐步深入到数据采集、存储、清洗、分析和可视化的全流程。我们将使用最新的Python技术栈,包括aiohttp异步爬虫、MongoDB存储、Pandas数据处理以及Pydeck三维可视化等。本文提供了完整的代码实现,并探讨了在实际应用中可能遇到的问题及其解决方案。关键词:AIS数据、Python爬虫、异步IO、数据可视化、海事分析。

2201_76125261的博客 811

栈和堆的区别

栈和堆的区别 前面已经介绍过,栈是由编译器在需要时分配的,不需要时自动清除的变量存储区。里面的变量通常是局部变量、函数参数等。堆是由malloc()函数分配的内存块,内存释放由程序员手动控制,在C语言为free函数完成。栈和堆的主要区别有以下几点: (1)管理方式不同。 栈编译器自动管理,无需程序员手工控制;而堆空间的申请释放工作由程序员控制,容易产生内存泄漏。对于栈来讲,是由编译器自动管理,无需...

weixin_43123279的博客 4952

Go语言爬虫:chromedp 的详细使用

chromedp 是 Go 语言中无头浏览器自动化的终极利器。它能驱动真实的 Chrome 浏览器,处理 JavaScript 渲染、复杂交互和反爬虫机制

数据知道的博客 4492

C++堆和栈的区别和联系

1、堆和栈的含义 在C++中,内存分为5个区:堆、占、自由存储区、全局/静态存储区、常量存储区 1、栈: 由系统自动分配和释放内存,存放函数的参数值,局部变量的值等,分配方式类似于数据结构中的栈 。 2、堆: 一般由程序员分配和释放内存(由new申请内存,delete释放内存), 若程序员不释放,会造成内存泄露,程序结束时可能由OS回收,分配方式类似于链表 。 3、自由存储区: 是由malloc等...

会飞的鱼的博客 3518

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

c++中堆和栈的区别

堆和栈的区别

qq_45673733的博客 4677

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

堆和栈区别

堆区和栈区:程序运行时的内存区域 我们把内存分为堆空间和栈空间。 栈空间比较小,但是读取速度快 堆空间比较大,但是读取速度慢 1.栈区 栈的特征: 数据只能从栈的顶端插入和删除 把数据放入栈顶称为入栈(push) 从栈顶删除数据称为出栈(pop) 简单地说:先进后出 2.堆(区分数据结构中堆(Top k)二者没有任何关系) 堆是一块内存区域,与栈不同,堆里的...

Lange_Taylor的博客 266

廖雪峰Python教程[完整版]

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

java栈和堆的区别_Java中堆和栈的区别

堆和栈都是Java用来在RAM中存放数据的地方。堆(1)Java的堆是一个运行时数据区,类的对象从堆中分配空间。这些对象通过new等指令建立,通过垃圾回收器来销毁。(2)堆的优势是可以动态地分配内存空间,需要多少内存空间不必事先告诉编译器,因为它是在运行时动态分配的。但缺点是,由于需要在运行时动态分配内存,所以存取速度较慢。栈(1)栈中主要存放一些基本数据类型的变量(byte,short,int,...

weixin_33515785的博客 4654

C++堆和栈的区别

堆(Heap)和栈(Stack)是两种主要的内存分配区域,它们在内存管理、性能和使用方式上有很大的区别。了解它们的差异可以帮助你更好地进行内存管理和优化代码。

qq_43572400的博客 1091

JVM——栈和堆概述,以及有什么区别?

从英文单词角度来说栈:stack堆:heap从数据结构角度来说栈和堆一样:都是先进后出,后进先出的数据结构从 JVM 内存空间结构角度来说栈:通常指 Java 方法栈,存放方法每一次执行时生成的栈帧。堆:JVM 中存放对象的内存空间。包括新生代、老年代、永久代等组成部分。

weixin_62458944的博客 2307

JVM-堆和栈的区别

Java程序90%的性能问题,竟都藏在这两个‘内存兄弟’的爱恨纠葛里——你真的懂堆和栈的致命博弈吗?

XiangLinXu的博客 1515

Java中堆和栈的区别

堆和栈都是Java用来在RAM中存放数据的地方。 堆 (1)Java的堆是一个运行时数据区,类的对象从堆中分配空间。这些对象通过new等指令建立,通过垃圾回收器来销毁。 (2)堆的优势是可以动态地分配内存空间,需要多少内存空间不必事先告诉编译器,因为它是在运行时动态分配的。但缺点是,由于需要在运行时动态分配内存,所以存取速度较慢。 栈 (1)栈中主要存放一些基本数据类型的变量(byte,short,int,long,float,double,boolean,char)和对象的引用。 (2)栈的优势是,存取速

欢迎关注公众号:【码农突围】,公号后台回复9999,可以获取一份500页的LeetCode刷题笔记。 4204
上一篇: VC的若干实用小技巧
下一篇: 获取快捷方式的文件路径
goingup
博客等级 码龄22年 52粉丝 158原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值