内存中堆(heap)和栈(stack)的区别(非数据结构中的堆和栈)

栈、堆内存到底是如何申请的,方法是如何入栈出栈的——内存结构理解学习 对于软件开发者而言,理解和熟悉计算机内存知识是最为基础的了。今天我就来翻翻旧账,回顾回顾看看我有哪些点遗漏了,在此共同学习。 提起内存,我们常常想到三个区域: 1,静态区,静态变量 static variables / constant  ,常量,静态变量就存储在静态区域,这个区域比较简单,我们就只需要知道怎么通过地址访问他就行了。 2,堆,动态变量 关键字new ,通过new 创建的对象, 阅读详情
在进行C/C++编程时,需要程序员对内存的了解比较精准。经常需要操作的内存可分为以下几个类别:

      1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
       2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
      3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
      4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
      5、程序代码区—存放函数体的二进制代码。
以下是一段实际说明的程序代码:

这是一个前辈写的,非常详细
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}

二、堆和栈的理论知识
2.1申请方式
stack:
由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间
heap:
需要程序员自己申请,并指明大小,在c中malloc函数
如p1 = (char *)malloc(10);
在C++中用new运算符
如p2 = (char *)malloc(10);
但是注意p1、p2本身是在栈中的。
2.2
申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,
会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。
2.3申请大小的限制
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
2.4申请效率的比较:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度, 也最灵活
2.5堆和栈中的存储内容
栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
2.6存取效率的比较

char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:
#include
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
对应的汇编代码
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指edx中,在根据edx读取字符,显然慢了。
?

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

堆和栈的区别主要分:
操作系统方面的堆和栈,如上面说的那些,不多说了。
还有就是数据结构方面的堆和栈,这些都是不同的概念。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构。
虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。

Python自动化:3分钟搞定微信收藏链接批量导出到TXT(附完整代码) 本文介绍如何使用Python自动化工具在3分钟内将微信收藏链接批量导出到TXT文件。通过模拟人类操作和OCR技术,脚本高效处理大量链接,显著提升工作效率,并附有完整代码和实战避坑指南。 阅读详情

相关推荐

Matlab机械臂建模:机器人工具箱的使用&&导入自己的机械臂模型

本文主要介绍如何在matlab中建立机械臂模型(前提要下载了Robotics Toolbox机器人工具箱~),并进行基于正逆运动学计算的轨迹运动。对于已有的Solidworks机械臂三维模型,如何导入Matlab,并对其进行运动控制。

m0_46427461的博客 5万+

顺序栈(C语言)

存储结构:顺序栈使用数组作为其基本存储结构。这个数组通常是一个连续的内存块,可以容纳一定数量的元素。栈顶指针:顺序栈使用一个指针来标识栈顶元素的位置。这个指针通常指向数组中最顶部的元素,或者指向栈顶元素上方的一个空位置,以便插入新元素。栈的大小限制:顺序栈的大小通常是固定的,由数组的容量决定。一旦栈满,就无法再插入新的元素,除非进行一些特定的操作来扩展栈的容量。

weixin_54454406的博客 297

强化学习-马尔可夫模型

前文提到了强化学习源自马尔可夫决策过程,本文从马尔可夫概念入手,讲解和马尔可夫有关的模型和概念。在马尔科夫决策过程中,我们有一个智能体,它在一个马尔科夫过程中进行决策,每次决策都会导致状态的转移和获得即时奖励。智能体的目标是通过选择动作来最大化未来奖励的期望值。通常马尔科夫决策过程是个五元组:SAPRγSAPRγS 表示状态集合,代表智能体可能处于的所有状态。A 表示动作集合,代表智能体可以采取的所有动作。

君子之学必日新,日新者日进也。不日新者必日退,未有不进而不退者 8062

Linux分配虚拟内存(申请内存)的两种方式

这里写目录标题申请小于128k的内存申请大于128k的内存释放内存 从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)。 brk是将数据段(.data)的最高地址指针_edata往高地址推。 mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。 这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。

TABE_的博客 4361

ORCAD 层次化原理图使用TCL获取位号的方法

orcad tcl 获取occurrence位号的方法。

m0_46675718的博客 1127

【win11+vs 2017+OpenCV4.5.5+Qt5.12配置】详细安装过程+小问题解决

由于Qt5无法与最新的vs2022兼容,扩展工具中一直显示不可用,所以将vs降级成vs2017。在安装Qt的过程中,会选择安装Qt套件,其中就的MCVS 2017,说明vs2017是与qt兼容的。当然也可以用qt creator这一原生IDE。OpenCV版本目前是最新的4.8.0,使用过程中没有什么问题,但是还是安装低版本大概率避免一些玄学问题。

qq_45306739的博客 3350

heap与stack的区别

java 的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用 new创建的对象都放在堆里,所以,它不会随方法的结束而消失。 方法中的局部变量使用 f...

weixin_30912051的博客 762

使用html和JavaScript实现一个简易的物业管理系统

码实现了一个简易的物业管理系统,主要使用了以下技术和功能: 1.主要技术 使用的技术: HTML: 用于构建网页的基本结构。 包括表单、表格、按钮等元素。 CSS: 用于美化网页的外观和布局。 设置字体、颜色、边距、对齐方式等样式。 JavaScript: 用于处理用户交互和动态更新页面内容。 实现了新增住户、查询住户、编辑住户、删除住户等功能。 处理表单提交事件,验证输入数据,并更新表格显示。 DOM操作: 使用 JavaScript 直接操作 HTML DOM 元素。 动态

weixin_41312759的博客 1778

栈空间申请内存大小限制

在做分布式存储ceph项目中,遇到一个数组过大,导致栈空间内存申请失败问题,特记录一下。 问题描述: 在ceph块存储实现架构中,对用户提供逻辑卷(image),内存数据保存时,将image切分成对象(object)进行落盘。image比较大,一般为TB级别,object大小固定一般为4M(可通过参数配置,默认4M),故一个1TB的卷可切分为262144个object。在一个处理image读写...

hfutljx的博客 3072

YOLO11涨点优化:小目标检测 | 多头检测器提升小目标检测精度

引入多头检测器助力YOLO11,添加一个微小物体的检测头暴力提升小目标检测性能

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 4742

Windows 11 - 打开操作安全中心提示 “需要使用新应用以打开此 Windowsdefender 链接“ 解决方案(电脑更新了 Win11 系统版本后,想关闭病毒防护盾牌的时候提示打不开)

Windows 11 - 打开操作安全中心提示 "需要使用新应用以打开此 Windowsdefender 链接" 解决方案(电脑更新了 Win11 系统版本后,想关闭病毒防护盾牌的时候提示打不开),当您点击任务栏上要关闭安全中心防护设置时,这种情况打不开怎么解决,怎么办,Windows安全中心,病毒和威胁保护,账户保护,防火墙和网络保护,设备安全性。

🏆 前端领域优质创作者 1万+

堆(Heap)、栈(Stack)

前言 堆(Heap)、栈(Stack)在不同的场景下,代表不同的含义。 (1)程序内存布局场景下,堆(Heap)、栈(Stack)代表两种内存管理方式; (2)数据结构场景下,堆(Heap)、栈(Stack)表示两种常用的数据结构; 一、程序内存中的堆(Heap)、栈(Stack) Code、Data、BSS——在编译时确定;保存基本代码和数据的区域。 BSS:保存未初始化的数据; Data:保存初始化数据 1、...

1万+

硬件工程师提前批真题及答案解析2

我们需要考虑题目可能的简化假设,即输入电阻 Ri​ 可能是 rbe​ 和 βre​ 的组合,但题目可能简化为: Ri​≈rbe​+βre​。由于锗管的正向导通电压较小(0.2 V~0.3 V),而硅管的正向导通电压较大(0.6 V~0.7 V),因此-4.7 V的电压差不符合硅管的特性,而更接近锗管的特性。在三极管电路中,静态电位是指在无信号输入时,三极管各电极的直流电压。re​ 是动态发射极电阻,通常可以近似为 re​=IE​VT​​,但在题目中已经给出了 re​=300Ω,因此可以直接使用这个值。

XU157303764的博客 777

什么是栈(Stack)?什么是堆(Heap)?栈和堆的区别是什么?

原参考地址:https://zhidao.baidu.com/question/36918441.html 栈:由操作系统自动分配释放 ,存放函数的参数值,局部变量du的值等。其操作方式类似于数据结构中的栈; 堆: 一般由程序员分配释放, 若程序员不释放,程序结束时可能由回收,分配方式倒是类似于链表。 堆栈缓存方式区别: 栈使用的是一级缓存, 通常都是被调用时处于存储空间中,调用完毕立即释放; 堆是存放在二级缓存中,调用这些对象的速度要相对来得低一些。 堆栈数据结构区别: 堆:堆可以被看成是一棵

Menqq的博客 2万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Devexpress16.2.6破解工具

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

C/C++中栈(stack)和堆(heap)的区别

C/C++中栈(stack)和堆(heap)的区别简单理解程序的内存分配示例栈和堆的理论知识申请方式申请后系统的响应申请大小的限制申请效率的比较栈和堆中的存储内容存取效率的比较小结 简单理解 栈(stack):是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。 堆(heap):是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 程序的内存分配 由C/C++编译...

https://github.com/blingbling-110 2394

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

c++中堆和栈的的区别(stack vs heap)

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

hyqsong的专栏 6969

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

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

程序内存中堆(Heap)和栈(Stack)的区别

想象一下,我们做饭时,切菜、备料都是在厨房的操作台上完成的。操作台空间不大,但取放东西极其方便,做完一道菜,台面也就清理干净了。这就是栈。 而做饭所需的大量食材、调料,我们不可能全堆在操作台上,而是会存放在一个很大的储物间或冰箱里,需要时再去取。这个储物间就是堆。

楚Y6的博客 1473

Heap And Stack 堆与栈的区别

交代一下背景,最近一直在看C++的相关知识,今天刚好看到“引用”这一部分。于是好奇心驱使,我想知道它与java的引用到底有什么不同,于是开始搜索大法,java的引用更加与c++的指针更加类似,但是也不一样,当然这不是重点。然后搜索的时候,突然又想知道在内存中的存储情况,于是开始搜索……,搜索……。对于heap与stack的区别我又模糊了,于是到了今天的重点,顺便记录一下自己搜索的成果。 英文好的同学

moon-sky的专栏 4374

内存中堆(heap)与栈(stack)的区别

根源出处已不可考证,不过写的很好,转来当作备忘。 一个程序一般分为3段:text段,data段,bss段。 TEXT 段:就是放程序代码的,编译时确定,只读;DATA段:存放在编译阶段(而非运行时)就能确定的数据,可读可写。就是通常所说的静态存储区,赋了初值的全局变量和静态变量存放在这个区域,常量也存放在这个区域;BSS 段:定义而没有赋初值的全局变量和静态变量,放在这个区域。

IronYoung_不惧未来 6466

解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法

原文链接: 解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。_wu594914197的博客-优快云博客解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法_gaoyong_stone的博客-优快云博客_栈堆静态区的用法 堆区:专门用来保存对象的实例(new 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中) 1.存储的全部是对象,每个对象.

weixin_43653890的博客 2063

堆(heap)和栈(stack)的理解和区别

脑海里的知识点过于碎片化,总结堆(heap)和栈(stack)的理解和区别。

wahkim的博客 1271

堆(heap)和栈(stack)区别

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

二进制模----细微行动改变影响世界 1865

堆 (heap)和 栈 (Stack)在 C++中的区别

堆 heap 和 栈 Stack在 C++中的区别 文中所有的例子和内容均来自于如下视频讲解: https://www.youtube.com/watch?v=wJ1L2nSIV1s&list=PLlrATfBNZ98dudnM48yfGUldqGD0S4FFb&index=54 堆(heap)和栈 (stack) 是 RAM(Random Access Memory) 中的两块内...

weixin_44387066的博客 590

C++ 中的栈(Stack)数据结构与堆的区别与内存布局(Stack vs Heap)

可以自己用vector或实现栈逻辑,常见于算法题或底层系统开发。std::stack是一个容器适配器 (container adapter),它在内部使用其他容器(如dequevectorlist)来存储元素。T data[N];特征栈 (Stack)堆 (Heap)分配方式系统自动程序员控制生命周期函数结束自动释放必须手动释放地址增长方向向下(高→低)向上(低→高)管理开销小大空间大小较小(默认几 MB)

qq_36812406的博客 1201

堆(heap)和栈(stack)有什么区别?

一、Java内存模型 1.哪里用到了内存划分? (1)虚拟机执行Java代码时,首先要把字节码文件加载到内存,那么这些类的信息都存放在哪个区域呢? (2)当我们创建一个对象实例的时候,虚拟机要为对象分配内存,虚拟机是如何分配内存的呢? 2.Java内存模型(Java虚拟机的内存是如何划分的?虚拟机内存划分机制?) (1)程序计数器:是线程私有的,JVM支持多线程同时执行,存放当前正在...

Michaeles的博客 1727

Heap(堆)与Stack(栈)的区别

特性Stack(栈)Heap(堆)管理方式系统自动分配 / 释放程序员手动分配 / 释放(new/delete 等)内存结构连续,LIFO 顺序不连续,随机分配大小限制较小(MB 级)较大(GB 级)访问速度快(硬件支持,连续内存)慢(需查找空闲块,间接寻址)存储内容局部变量、参数、返回地址等动态对象、大数组、跨函数数据等碎片问题无有(易产生碎片)溢出风险高(递归过深、大局部变量易触发)低(内存不足时分配失败)

2401_87318967的博客 523
下一篇: Netwrok,Security,Cisco - 关于 PIX 与 ASA
AlphaJay
博客等级 码龄22年 19粉丝 4原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值