栈和堆(the stack and the heap)

游戏大厂技术护城河:你以为他们靠“美术和买量”,其实背后全是硬家伙 先把效果堆满到快上线了才发现低端机跑不动然后疯狂砍特效、降分辨率,画面崩、口碑崩机型分档(低/中/高)每帧预算(CPU/GPU 各多少 ms)每种资源预算(贴图、网格、粒子数量)性能自动回归(每天跑性能测试,发现波动立刻报警)大白话:小厂像装修到入住前才发现电路不够,临时拉线;大厂从设计图开始就算承重、算电路、算水压。玩家会不会来?活动会不会爆?版本会不会翻车?外挂会不会泛滥?竞品会不会抄?流量不确定 → 可扩容架构版本不确定 → 灰度与回滚。 阅读详情

程序需要用到的内存可以分为四大类:

  • 编译程序的代码区内存
  • 存储全局变量的全局区内存
  • 堆,动态分配的变量所需的内存就是从堆中分配的。
  • 栈,参数和局部变量就是从栈中分配的。
前两个就不多说了,主要说说堆和栈。

堆

堆是一个大的“内存池”,供动态分配内存之用。在C++中,用new 操作符分配的内存就是从堆中分配的。

int *pValue = new int; // pValue is assigned 4 bytes from the heap
int *pArray = new int[10]; // pArray is assigned 40 bytes from the heap
我们并不确定将在堆中分配那一块地址,所以new返回的是一个指针。我们连续两次用new分配内存,这两块内存并不一定是连续的。

int *pValue1 = new int;
int *pValue2 = new int;
// pValue1 and pValue2 may not have sequential addresses

当动态分配的变量删除后,所占用的内存会归还给堆。

堆的利弊:

  1. 内存分配出去后一直被占用,知道归还后才能被其他变量申请。
  2. 动态分配的内存必须用指针才能访问
  3. 以为堆的容量很大,所以大的数组、结构体或者类一般应该分配在堆上。
栈

上面说到,参数和局部变量从栈中分配内存。参数和局部变量属于函数的一部分,所以我们看看函数调用的时候栈上相应的操作。

  1. 将当前函数的指令的地址存储在栈中,当被函数调用结束后cpu根据这个地址返回执行之前的操作。
  2. 在栈中开辟空间,供被调函数返回值所需。
  3. cpu跳到被调用函数中执行
  4. 被调用函数中的局部变量压入栈中。
当被调函数返回时:

  1. 被调用函数返回值的一份拷贝存储在上边2中的空间中。
  2. 栈顶指针回退,栈上的参数和局部变量将销毁
  3. 函数返回值赋值给当前变量
  4. cpu从栈中取出之前存入的指令地址重新执行。
栈溢出

当局部变量分配过大或者函数调用深度过大时就会发生栈溢出,导致程序崩溃。例如:

int main()
{
    int nStack[100000000];
    return 0;
}

栈的利弊:

  1. 从栈中分配的变量会随着栈销毁而销毁
  2. 在编译的时候,从栈中分配的内存是连续的,所以可以通过变量名直接访问。
  3. 由于栈空间相对较小,所以大的数组、结构体或者类就不要从栈中分配了。

RT-DETR训练自己的数据集(从代码下载到实例测试) 在Windows10上配置CUDA环境教程是百度提出的一种实时目标检测模型。RT-DETR采用了与DETR相同的编码器和解码器结构,但对其进行了大量的优化,在保持较高检测精度的同时,实现了实时目标检测,为目标检测领域提供了一种新的有效解决方案,具有广泛的应用前景,如自动驾驶、智能监控、机器人等领域。以上是RT-DETR官方的论文和代码,详细介绍了RT-DETR的构成和实现。在YOLOv10中也实现了RT-DETR的代码,所以本文使用YOLOv10的项目文件进行RT-DETR的训练和测试。YOLOv10。 阅读详情

相关推荐

安装 Claude Code 并接入阿里云百炼(Bailian)

这些工具通常提供可视化界面,只需在设置中填入阿里云百炼的 API Key 和 Base URL 即可,无需配置环境变量。注意:如果你使用的是阿里云百炼的 Coding Plan 套餐,请使用该套餐专属的 API Key 和 Base URL。你可以使用文本编辑器打开该文件,或者在终端使用命令(如 macOS/Linux 下使用 nano ~/.claude/settings.json)。你可以直接用自然语言下达指令,例如:“帮我在这个目录下写一个 Python 脚本,实现两数之和的功能”。

hopsky的博客 1844

堆(Heap)、栈(Stack)

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

1万+

OnePlus救砖指南:线刷包与OTA全量包实战解析

本文详细解析了OnePlus手机救砖的两种核心方法:线刷包与OTA全量包。针对手机变砖的不同状况(如黑屏、能进Recovery等),文章提供了清晰的判断标准和对应的实战操作指南。重点阐述了线刷包作为终极救砖手段的底层原理与详细步骤,并对比了OTA全量包作为温和修复方案的使用场景与卡刷流程,旨在帮助用户安全、有效地恢复手机系统。

weixin_28312391的博客 1318

堆和栈的区别

The differences between the stack and the heap can be confusing for many people. So, we thought we would have a list of questions and answers about stacks and heaps that we thought would be very hel...

445822357 225

BUCK 电路详解

参考内容: 手撕Buck!Buck公式推导过程 电力电子的基础应用 《精通开关电源设计(第二版)》 Buck电源芯片输出有问题?检查这几样 原来PWM这么简单! BUCK 电路构建 根据高中所学习的物理知识可以很容易的想到,使用一个滑动变阻器即可实现降压和稳压的效果。当负载波动时,通过改变滑动变阻器的阻值,可以调节负载所获得的电压。但是使用滑动变阻器的劣势也很明显,大量的耗能会导致器件温度快速升高。 上面所提到的电路主要缺点在于导通器件(变阻器或三极管)本身存在耗能,那么有没有不会耗能的导通器件呢?

Guanngxu的博客 3987

MT6768平台Sensor Bring Up全流程实战:从驱动添加到问题排查(附避坑指南)

本文详细介绍了联发科MT6768平台Sensor Bring Up的全流程实战指南,从驱动添加、硬件配置到问题排查,提供了全面的避坑建议。内容涵盖环境准备、驱动文件集成、硬件接口配置、编译系统适配以及常见问题解决方案,帮助开发者高效完成传感器集成与调试工作。

weixin_30374009的博客 416

数据结构之堆(Heap)(9)

1 堆 1)堆中某个节点的值总是不大于或不小于其父节点的值; 2)堆总是一棵完全数。    将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。下面主要讨论二叉堆。    堆常用数组实现,如果父亲节点在数组中的位置是index,则其左节点位置是2*index+1,右节点位置是2*index+2.    堆为什么通常用数组实现? To insert an ele

公众号(猴子数据分析) 1705

小程序 video 控制器外观调整_Kessil 360X Tuna Sun无线控制器使用分享

之前分享了Kessil 360X Tuna Sun开箱记录,时间关系,没来得及使用WiFi Dongle无线控制器。昨晚抽空实操了一下,做个操作记录,希望对大家有参考Kessil无线模块操作指南官方视频英文教程配中文字幕,非常详尽语速较快,重点位置可以暂停操作点击边框调出视频工具条1、拆包取控制器,保存二维码Kessil WiFi Dongle包装打开包装就能看到Kessil无线控制模...

weixin_39759060的博客 4733

java中堆 栈的英文_Java中的栈和堆

人们常说堆栈堆栈,堆和栈是内存中两处不一样的地方,什么样的数据存在栈,又是什么样的数据存在堆中?这里浅谈Java中的栈和堆首先,将结论写在前面,后面再用例子加以验证。Java的栈中存储以下类型数据,栈对应的英文单词是Stack基本类型引用类型变量方法栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变...

weixin_33147807的博客 2554

YOLOv8_obb训练流程-原理解析[旋转目标检测理论篇]

本文主要介绍了YOLOv8旋转目标检测的流程,介绍了标签的解码、预测结果的解码,以及如何理解旋转角度等内容,还介绍旋转目标检测框的正样本选取及Loss计算。

ice 4731

NeRF-Pytorch(训练自己的数据集过程全记录+环境配置+COLMAP+问题解决)

写于2025/1/26,在用NeRF训练自己的数据集过程中该踩的坑都踩过了,发现网上并没有详细完整写这些问题解决过程的帖子,遂自己进行一个全记录和复盘。 整篇文章包括:NeRF训练环境配置;COLMAP三维重建过程(直接给出代码,规避一些bug);在训练时候出现的问题。 本篇文章仅针对llff格式数据集。

m0_62577716的博客 1774

c++中在堆和栈中申请空间的差别

堆中和栈中申请的空间的比较, 我找到了下面的比较: 栈的情况:栈上分配空间的好处是快,而且对象生存期是自动的,离开当前域之后就自动析构回收。坏处就是栈空间有限,而且不能人为控制对象的生存期,比如你无法将一个函数内部的栈上的对象返回,因为这个函数执行完毕后栈空间会自动回收。 堆的情况堆上分配空间就相反,new一个空间出来是较慢的,而且对堆上对象的访问也稍慢于栈上。一旦new一个空间出来,需要自己...

weixin_30484739的博客 371

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

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

数据知道的博客 4493

JVM学习,堆和栈 —— What and where are the stack and heap?

The stack is the memory set aside as scratch space for a thread of execution. When a function is called, a block is reserved on the top of the stack for local variables and some bookkeeping data....

a3363642的博客 176

蓝牙模块HM-10手册

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

SAP B1中文培訓教材_SDK

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

IAR中使用堆和栈的问题——Working with the Stack and Heap

为什么80%的码农都做不了架构师?>>> ...

weixin_34265814的博客 780

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

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

The difference between stack and heap(堆和栈的区别)

for a  complete routine , whose distribution

dark_baron的专栏 458

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

堆(Heap)和栈(Stack)的区别?

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

kid0912的回收站 1796

Heap And Stack 堆与栈的区别

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

moon-sky的专栏 4374

嵌入式系统中堆heap和栈stack的管理——如何计算stack size

ben文一步步介绍了嵌入式系统中为了充分优化利用存储资源稳健设计中的分配堆heap和栈stack的方法。第一部分是如此在系统中测试需要的stack的大小(使用栈保护区和链接器的方法),以及如何检测栈相关的下溢错误信息。 程序运行的各种存储段分类 程序运行时在内存中主要有代码段、数据段、堆栈段(堆空间和栈空间)、进程头、动态链接库等区域。其中数据使用到的段包括 数据段:静态内存空间,其中...

lyw851230的专栏 3079

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

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

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

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

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

Menqq的博客 2万+

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

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

hyqsong的专栏 6969

Heap And Stack 堆 栈

2.Heap And Stack  Thinking in java第四章的内容是关于内存分配和初始化的,对这一章的学习带出了我以往学习中的一个模糊点:究竟什么是堆存储(Heap)?什么是栈存储(Stack)?有什么区别呢?翻了不少资料,补了这一课,觉得非常受用.  2.1 内存分配策略  按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的.  静态存储分配是指在编

ridrare的专栏 1540

STM32堆和栈(Heap & Stack)及SRAM存储使用

编译一个程序,出现下面的信息:         明明程序没有什么内容,为什么变量大小就有RW+ZI=52+1836=1888字节大小了呢,就已经使用了1888字节的SRAM空间。让我们打开map文件:         可以看到每个文件所使用的SRAM大小,比如delay文件使用了4个字节,地址从0x20000014到0x20000017。其中可以看到HEAP和STACK占了大头

qlexcel的专栏 1万+

堆Stack和栈Heap

堆Stack和栈Heap逻辑区别物理区别申请方法申请大小限制 逻辑区别 栈是存储局部变量的空间,由操作系统(编译器)自动分配和释放,可以存放参数值,局部变量之类的; 堆则是由程序员进行申请和释放(部分语言可能不需要手动释放,如Java,但是使用某些语言进行编程如果不释放会导致内存泄漏。) 栈由系统自动分配,速度较快。但程序员是无法控制的。 堆是由程序员申请分配的内存,一般速度比较慢,而且容易产生内...

Misty_Rain_的博客 233

堆 (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
上一篇: pythonchallenge2(众里寻她千百度)
下一篇: 深拷贝和浅拷贝
bdss58
博客等级 码龄15年 220粉丝 243原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值