详解堆与栈

栈(Stack)与堆(Heap)工作原理详解 特性栈(Stack)堆(Heap)管理方式自动(方法结束自动释放)垃圾回收器(GC)管理分配速度极快相对较慢空间大小较小(默认约 1MB)较大(受物理内存限制)碎片问题几乎没有可能产生碎片(GC 会整理)线程安全线程私有共享,需注意并发主要存储值类型局部变量、引用地址对象实例、数组生命周期跟随方法调用由引用可达性决定溢出错误栈像是方法的“临时工作台”,来得快去得也快,自动清理;堆像是“公共仓库”,对象放进去后,由垃圾回收员根据是否还有人引用它来决定何时清理。 阅读详情

一、预备知识—程序的内存分配
    一个由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。因此,能从栈获得的空间较小。
       
        堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚 拟内存。由此可见,堆获得的空间比较灵活,也比较大。

 

转自 http://hi.baidu.com/neujiming/blog/item/fb989101261e2d071d95837d.html

激光条纹中心提取——Steger 激光条纹中心提取-Steger 好久没有记录了,记录一下今天学习的内容,据说Steger在激光条纹中心提取上神一般的存在。文章和代码都分享给大家了哈,其中有四个文件,3个C++,一个python,python一个抠图文件,3个c++包含背景图+原图, 单张图提取, 多张图提取。 分享代码 #include <opencv2\core.hpp> #include <opencv2\highgui.hpp> #include <opencv2\imgproc.hpp> #i 阅读详情

相关推荐

Transformer模型详解(图解最完整版)

Transformer由论文提出,现在是谷歌云TPU推荐的参考模型。论文相关的Tensorflow的代码可以从GitHub获取,其作为Tensor2Tensor包的一部分。哈佛的NLP团队也实现了一个基于PyTorch的版本,并注释该论文。在本文中,我们将试图把模型简化一点,并逐一介绍里面的核心概念,希望让普通读者也能轻易理解。Transformer 与 RNN 不同,可以比较好地并行训练。

2501_91695094的博客 2704

栈与堆详解

关于栈与堆的理解 我相信大家对于栈和堆一定并不陌生,在我们学习语言,理解语言的过程中中难免出现一些专业术语,使我们又掉了几根头发,所以我一直在为不成为秃子而努力着。 要理解栈和堆那么首先知道它们是什么,有什么区别,住在哪里? 1.栈和堆是什么? 栈(操作系统):由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈; 堆(操作系统):存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。 这里我们引进两个知识(简单数据类型和复杂.

javavavavav的博客 2434

MOOS-ivp 实验三 MOOS简介(3)

MOOS-ivp 实验三 MOOS简介(3) 继上一篇文章继续对实验进行记录 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录MOOS-ivp 实验三 MOOS简介(3)六、A Simple Example with pXRelay1.pXRelay基本使用2.pXRelay简单例子3.pXRelay实验七、First Experiments in Modifying MOOS App Code1.下载一个MOOS模板文件2.打开MOOS模板文件总结 六、A Simple E

weixin_44151170的博客 2535

Java中栈与堆的算法详解

本文系统讲解Java内存中栈与堆的结构差异与应用场景。栈用于方法调用,存放局部变量和栈帧,具有快速分配释放的特点;堆存放对象实例,由GC管理,适合共享数据和大对象。文章详细分析了栈帧结构、堆的分代管理机制,以及逃逸分析对对象分配的影响。在算法方面,介绍了栈在括号匹配、单调栈等场景的应用,以及堆(优先队列)在Top-K、最短路径等问题中的实现。通过多个代码示例展示了两种数据结构的具体应用,并提供了内存调优建议。

2403_88265297的博客 1104

C语言入门—初识C语言

一、C语言概述 1、什么是C语言 语言是用来交流沟通的,有一方说,有一方听。必须要两方参与。(自言自语的除外) 语言是人与人交流,而C语言是人与机器交流 语言有独特的语法规则和定义,双方必须遵循这些规则和定义才能实现真正的交流。 接下来首先了解下计算机的组成: 2、计算机介绍 2.1、计算机结构组成 2.2、计算机系统组成 2.3、程序的指令 指令是对计算机进行程序控制的最小单元 计算机的指令系统是指所有指令的集合 程序是指为完成某一项特定任务而用某种言语编写的一组指令序列 3、C语言发展历程 3.

jun319817的博客 1036

华为产品安全基线

一、敏感信息安全传输 1、采用HTTPS安全协议传输 2、客户端本地保存的敏感信息,需要先加密再保存使用,不可逆支持PBKDF2(迭代10000次)加密保存,可逆支持AES256+IV保存,密钥支持可更新 二、认证鉴权 1、License中心与分析节点分布式部署,需要做用户名+口令安全认证,支持使用HTTPS安全协议。 2、客户端登录支持防暴力破解,支持验证码,多次连续尝试登陆失败后锁定账...

zileixu的博客 1万+

堆与栈详解

问题描述   编程语言书籍中经常解释值类型被创建在栈上,引用类型被创建在堆上,但是并没有本质上解释这堆和栈是什么。我仅有高级语言编程经验,没有看过对此更清晰的解释。我的意思是我理解什么是栈,但是它们到底是什么,在哪儿呢(站在实际的计算机物理内存的角度上看)? 在通常情况下由操作系统(OS)和语言的运行时(runtime)控制吗?它们的作用范围是什么?它们的大小由什么决定?哪个更快?

tkp2014的专栏 724

基于STM32、HAL库的WF282A气压传感器 驱动程序设计

测量范围:0-2.5MPa(可根据需求选择其他量程)输出方式:I2C或SPI数字接口。温度补偿范围:-20℃~85℃。低功耗设计,适合电池供电应用。工作电压:3.3V/5V。精度:±0.1%FS。

corlin6688的博客 395

一文详解堆栈(一)——数据结构的堆与栈

前言:我们经常听见一个概念,堆(heap)和栈(stack),其实在数据结构中也有同样的这两个概念,但是这和内存的堆栈是不一样的东西哦,本文也会说明他们之间的区别的,另外,本文的只是是以C/C++为背景来说明,不同的语言在内存管理上面会有区别。本文是第一篇,简要介绍数据结构中的堆与栈。 一、数据结构中的堆与栈 数据结构中,堆(heap)与栈(stack)是两个常见的数据结构,理解二者的定义...

MIss-Y的博客 2万+

【具身智能】感知 × 决策 × 执行:一个智能体的认知闭环怎么搭?

构建一个真正能在现实世界中运作的具身智能体,并不是简单地拼接“视觉 + 控制器 + 动作模块”就能完成的,它必须是一个**认知闭环结构**:能感知环境、理解状态、制定策略、执行动作,并从结果中学习反馈。 本讲将深入剖析具身智能的三大核心支柱:**感知系统、决策系统、执行系统**,并解析它们如何协同构建出一个“能观察、能思考、能行动”的智能体。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3267

【教程4>第8章>第44节】本章整体思维导图与学习总结

本教程系列提供FPGA/MATLAB/Simulink学习资源,包含《MATLAB入门100例》、《FPGA入门100例》、《Simulink入门60例》等基础教程,以及《FPGA/MATLAB/Simulink联合开发》进阶教程和《人工智能基础应用研究》专题,适合不同层次的学习者系统掌握相关技术。

FPGA/MATLAB学习教程/源码/项目合作开发 450

【算法与数据结构】堆与栈的联系区别(多角度详解)

- 堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下,堆与栈代表不同的含义。一般情况下,有两层含义: (1)程序内存布局场景下,堆与栈表示两种`内存管理` (2)数据结构场景下,堆与栈表示两种常用的`数据结构`

南城果宝的满腹经纶 5958

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...

Java栈与堆详解

此文章摘自 优快云论坛-JAVA版 Java栈与堆 ----对这两个概念的不明好久,终于找到一篇好文,拿来共享 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

路人甲的专栏 719

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

函数栈详解以及堆区与栈区的区别

在讲解函数栈之前,先看下内存空间布局:(关于内存布局更多介绍:http://blog.youkuaiyun.com/caigen1988/article/details/7737153) 用上面布局来看,栈空间在使用的时候应该是从高地址到底地址扩充。堆空间在使用的时候是从地地址到高地址扩充。 栈用来传递参数,存储返回地址信息,保存寄存器等。 为单个函数(过程)分配的那部分栈称为栈帧。每个函

菜根 5858

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java 中的栈与堆详解

栈是一种后进先出(LIFO)的数据结构,用于存储方法调用的局部变量和部分数据。堆是用于存放对象实例和数组的内存区域,是垃圾收集器管理的主要区域。栈:适合存储短期变量,速度快,线程安全,但容量有限。堆:适合存储长期存在的对象,灵活性高,但管理复杂,容易导致内存泄漏。

weixin_58316280的博客 428

详解堆与栈的区别(经典)(一)

详解堆与栈的区别(经典)(一) 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于 数据结构中的栈。 2

Gw's 嵌入式学习技术博客 954

Java中堆与栈详解

http://bbs.itcast.cn/thread-16877-1-1.html        栈与堆都是Java用来在RAM中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。   Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显...

lvwenwen 202

javascript中变量与栈、堆的关系详解

之后根据储存值的类型决定后续的流程,如果是基本类型则直接把值存入内存空间中。如果是引用类型则会在堆区中开辟一个内存空间并把它的地址存入到栈区的空间里即age中存的其实是堆的地址。如果是基本类型则先把变量name1中储存的值先给销毁再把name的值复制一份存入name1的变量中。如果是引用类型则因为占用内存较大所以不会复制自己,而是把栈区储存的地址复制一份存入b变量中。所以这俩个变量储存的地址是一样的都指向一个对象所以会互相干扰。变量的值的类型分为基本类型和引用类型。栈区内存有限只能储存大小固定的基本类型。

weixin_64208331的博客 545

C++ 中的栈与堆:区别与使用场景详解

理解栈和堆的区别是写出高效、安全 C++ 代码的关键!希望这篇文章能帮助你更好地掌握这两种内存管理方式...

C语言实战大全 1176

java堆与栈与常量池_Java堆、栈和常量池详解

下面主要介绍JAVA中的堆、栈和常量池:1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制。2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)3. 堆:存放所有new出来的对象。4. 静态域:存放静态成员(static定义的)5. 常量池:存放字符串常量和基本类型常量(pub...

weixin_35720393的博客 488

堆(Heap)与栈(Stack)详解

堆和栈是计算机内存管理中两个最重要的概念,它们在程序执行过程中承担着不同的职责,有着截然不同的特性和使用场景。 2. 栈(Stack)详解 2.1 栈的工作原理 2.2 栈的使用示例 2.3 栈帧结构详解 2.4 栈溢出问题 3. 堆(Heap)详解 3.1 堆的工作原理 3.2 堆的使用示例 3.3 堆内存管理器原理 3.4 堆内存问题与解决方案 4. 内存布局全局视图 4.1 程序内存布局 4.2 不同存储区域的变量示例 5. 性能分析与选择建议 5.1 性能对比测试 5.2 使用

huayidw的博客 3108

Java 栈(stack)与堆(heap) 详解

Java 栈(stack)与堆(heap) 1.概念 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 栈,堆的数据结构 栈就像装数据的桶或箱子 它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。 这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面...

shujie8823210的博客 406

详解JVM中的虚拟机栈与堆

1 虚拟机栈虚拟机栈中是有一个个栈帧组成,栈帧我们也知道是一个线程的一个方法的执行。栈帧包含以下内容:局部变量表:方法中定义的局部变量以及方法的参数放在这张表中操作数栈:以压栈和出栈的方...

JAVA高级架构 547
上一篇: Practical Guide to STL
下一篇: C语言编译过程总结详解
boby2010
博客等级 码龄17年 0粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值