c/c++编译器对程序占用的内存分配可分为以下几个部分:
1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。
4、文字常量区:常量字符串就是放在这里的。程序结束后由系统释放。
5、程序代码区:存放函数体的二进制代码。
对于c/c++编译器,堆和栈主要的区别由以下几点:
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可是相当困难的:)
相关推荐
实战分享:如何用YOLOv5s+BIFPN高效检测隧道裂缝(附数据集获取)
本文详细介绍了如何利用YOLOv5s结合BIFPN(双向特征金字塔网络)构建高效的隧道裂缝智能检测系统。文章从高质量数据集构建、针对性数据增强、模型架构选型与调优,到工程化部署全链路进行了实战分享,旨在为基础设施自动化巡检提供兼顾精度与速度的解决方案。
C++【侯捷】——— 堆、栈与内存管理
C++【侯捷】——— 堆、栈与内存管理StackHeapnewdeleteVC中内存分配 Stack class Complex { ... }; ... Complex c3(1,2); void main() { Complex c1(1,2); static Complex c2(1,2); Complex* p = new Complex(3); //heap }...
SAP入门技术分享四:模块化程序
SAP入门技术分享三:模块化程序
C/C++的内存分配?栈和堆的区别?为什么栈快?
一个由 C/C++ 编译的程序占用的内存分为以下几个部分 : 栈区( stack ) ——由编译器自动分配释放,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。其操作方式类似于数据结构中的栈; 堆区( heap )——一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收 。分配方式类似于链表; 全局区(静态区)(static)——存放全局变量、静态数据。初始化的...
单片机技术入门与实战:从零基础到项目开发
单片机(MCU)作为嵌入式系统的核心组件,集成了CPU、内存和各种接口电路,广泛应用于智能家居、工业控制和汽车电子等领域。其工作原理基于实时控制和低功耗设计,通过定时器、中断系统和通信接口等功能模块实现各种控制任务。在物联网和智能硬件快速发展的背景下,掌握单片机开发技术成为电子工程师的重要技能。本文以STM32和PIC系列为例,详细解析单片机的基本概念、功能模块和选型指南,并分享从入门到项目实战的系统学习方法,帮助开发者在3-6个月内快速掌握这一关键技术。
侯捷c++第八课 堆,栈与内存管理
栈:存在于某作用域(例如大括号内)的一块内存空间。通常,函数本体内声明的任何变量其内存块都取自栈。 堆:由操作系统提供的一块全局内存空间,需要用动态分配(new)取得空间。
快速卷积结构FIR数字滤波器的设计与ARM平台实现
本文提出了一种基于快速卷积结构的FIR数字滤波器设计与实现方案。通过Matlab设计了满足特定指标的低通FIR滤波器,采用重叠-保存法和重叠-相加法两种快速卷积算法,将计算复杂度从O(N·M)降低到O(NlogN)。详细介绍了滤波器系数生成、性能验证流程,并提供了ARM平台C语言实现的关键技术,包括定点量化处理。实验结果表明,该方法能有效滤除混合信号中的高频干扰,保留目标1kHz正弦信号,验证了设计方案的有效性。
(c/c++内存管理)堆和栈的区别
摘要:内存管理向来是C/C++程序设计的一块雷区,大家都不怎么愿意去碰她,但是有时不得不碰它。虽然利用C++中的smart pointer已经可以完全避免使用指针,但是对于对于指针的进一步了解,有助于我们编写出更有效率的代码,也有助于我们读懂以前编写的程序。 五大内存分区 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存...
SMPLify-x-master | 复现记录
由于毕业设计中将会用到smpl模型,而smplify方法的各环境依赖版本比较老,复现不太容易,因此便进行了smplifyx方法使用smplx的方法。由于在过程中遇到较多坑,因此进行记录和分享。
【雷达成像】基于matlab SAR雷达成像仿真【含Matlab源码 3750期】
SAR雷达成像仿真 完整的代码,方可运行;可提供运行操作视频!适合小白!
c/c++内存管理---堆和栈的区别(转)二
<br />c/c++编译器对程序占用的内存分配可分为以下几个部分:<br />1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。<br />2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。<br />3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
c/c++内存管理---堆和栈的区别(转)一
<br />一般认为在c中分为这几个存储区 <br />1栈 - 有编译器自动分配释放 <br />2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 <br />3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静 <br />态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 <br />- 程序结束释放 <br />4另外还有一个专门放常量的地方。 - 程序结束释放 <br />在函数体中定义的变量通常是在栈上,用malloc,
怀旧版电脑GBC模拟器
再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
C/C++堆栈的区别
*1.一个由C/C++编译的程序占用的内存:** ①栈区Stack 函数参数,局部变量等 ②堆区Heap malloc new 自动申请的内存 ③全局区(静态区)Static 1. BSS区 没有初始化或初始化位0的全局/静态变量 2. Data区 初始化的全局/静态变量(非const) ④文字常量区Rodata 字符串、const修饰的变量 ⑤程序代码区Text 函数体的二进制代码
win10 跳过U8环境检测的IE WebControls.rar
win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。
C/C++程序内存的分配
来源链接:https://blog.youkuaiyun.com/cherrydreamsover/article/details/81627855?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blo...
【C++干货篇】——C/C++内存管理
malloc:分配未初始化内存。calloc:分配并初始化为零的内存。realloc:改变已有内存块的大小,并可能移动内存块。使用这些函数时,记得调用free来释放不再需要的内存,以防止内存泄漏。int main()//只申请空间//申请空间+调用构造函数//没有默认构造可以自己传参//可以调用默认构造free(p1);//只释放空间//调用析构函数+释放空间delete p2;
C语言原理1 堆和栈有什么区别?
2013 年 5 月 22 日 by sciencefans 注意,本文非原创,本文转载自csdn 一直都把堆栈放一起,所以很多人会误以为他们的组合是一个词语,就像“衣服”一样简单,其实不然,今天在下就将最近学习总结的一些与大家分享。 一个由C/C++编译的程序占用的内存分为以下几个部分: 1、栈区(stack):又编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于
C/C++内存管理
内存管理
浅谈C/C++内存管理
介绍一下C/C++中的内存管理
C/C++中栈(stack)和堆(heap)的区别
C/C++中栈(stack)和堆(heap)的区别简单理解程序的内存分配示例栈和堆的理论知识申请方式申请后系统的响应申请大小的限制申请效率的比较栈和堆中的存储内容存取效率的比较小结 简单理解 栈(stack):是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。 堆(heap):是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 程序的内存分配 由C/C++编译...
C语言内存分配图以及栈和堆的区别
别的不多说了,图比文字更具有描述力,自己看! 一直都把堆栈放一起,所以很多人会误以为他们的组合是一个词语,就像“衣服”一样简单,其实不然,今天在下就将最近学习总结的一些与大家分享。 一个由C/C++编译的程序占用的内存分为以下几个部分: 1、栈区(stack):又编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈。
C/C++(三)C/C++内存管理
本文章介绍了C/C++的底层内存管理机制
C/C++中堆与栈的区别
在C/C++中堆与栈有两种含义: 内存层面:表示两种内存分配及管理方式。 数据结构层面:两种不同数据结构。 本文主要讲内存层面的。 1. C/C++内存分布 C/C++的内存分配主要包含以下几个方面: 1、栈区(stack):由编译器自动分配释放,存放函数的地址,参数值,局部变量等。 2、堆区(heap):一般由程序员分配释放(malloc/free、new/delete),若程序员不释放,程序结束时可能由操作系统回收。 3、全局区(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量
380



被折叠的 条评论
为什么被折叠?



