首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

学习笔记:内存,堆栈,到底为何物?

这里就有一个很重要问题,CPU存储器都是硬件,谁来负责操作这些硬件呢?这就要说到操作系统了。...考虑到内存资源总是有限,而对于多任务操作系统来说,应用程序越多自然占用就越多,那如何合理分配内存资源呢?两种划分方法:分段、分页。...带着这个疑问就去寻找栈应用场景,下面这个场景突然让些明白了什么:     “栈可以用来函数调用时候存储断点,做递归时要用到栈!”    ...好了,了这个理解再看下面的内容: 栈(操作系统):由编译器自动分配释放 ,存放函数参数值,局部变量值等。其操作方式类似于数据结构中栈。  ...栈,就是那些由编译器在需要时候分配,在不需要时候自动清除变量存储区。里面的变量通常是局部变量、函数参数等。

1.5K70

什么是堆栈,它们在哪儿?

计算机程序通常有一个栈叫做调用栈,用来存储当前函数调用相关信息(比如:主调函数地址,局部变量),因为函数调用之后需要返回给主调函数。栈通过扩展收缩来承载信息。...不要在栈上存储大块数据,这样可以保证足够空间不会溢出,除非出现了无限递归情况(额,栈溢出了)或者其它不常见了编程决议。 堆是任何可以动态分配内存统称。这要看你怎么看待它了,它大小是变动。...下面简单解释一下: 栈堆都是用来从底层操作系统中获取内存。 在多线程环境下每一个线程都可以他自己完全独立栈,但是他们共享堆。并行存取被堆控制而不是栈。...存储获取数据都是 CPU 寄存器值。 当函数被调用时,CPU使用特定指令把当前 IP (译者注:“instruction pointer”,是一个寄存器,用来记录 CPU 指令位置)压栈。...不可以函数活动记录(即局部或者自动变量)被分配在栈上, 这样做不但存储了这些变量,而且可以用来嵌套函数追踪。

1.8K50
您找到你想要的搜索结果了吗?
是的
没有找到

什么是堆栈,它们在哪儿?

计算机程序通常有一个栈叫做调用栈,用来存储当前函数调用相关信息(比如:主调函数地址,局部变量),因为函数调用之后需要返回给主调函数。栈通过扩展收缩来承载信息。...不要在栈上存储大块数据,这样可以保证足够空间不会溢出,除非出现了无限递归情况(额,栈溢出了)或者其它不常见了编程决议。 堆是任何可以动态分配内存统称。这要看你怎么看待它了,它大小是变动。...下面简单解释一下: 栈堆都是用来从底层操作系统中获取内存。 在多线程环境下每一个线程都可以他自己完全独立栈,但是他们共享堆。并行存取被堆控制而不是栈。...存储获取数据都是 CPU 寄存器值。 当函数被调用时,CPU使用特定指令把当前 IP (译者注:“instruction pointer”,是一个寄存器,用来记录 CPU 指令位置)压栈。...不可以函数活动记录(即局部或者自动变量)被分配在栈上, 这样做不但存储了这些变量,而且可以用来嵌套函数追踪。

63120

【大牛经验】关于堆那些事

栈不一样,从堆上分配重新分配块没有固定模式;你可以在任何时候分配释放它。这样使得跟踪哪部分堆已经被分配被释放变异常复杂;许多定制堆分配策略用来为不同使用模式下调整堆性能。...计算机程序通常有一个栈叫做调用栈,用来存储当前函数调用相关信息(比如:主调函数地址,局部变量),因为函数调用之后需要返回给主调函数。栈通过扩展收缩来承载信息。...不要在栈上存储大块数据,这样可以保证足够空间不会溢出,除非出现了无限递归情况(额,栈溢出了)或者其它不常见了编程决议。 堆是任何可以动态分配内存统称。这要看你怎么看待它了,它大小是变动。...下面简单解释一下: 1. 栈堆都是用来从底层操作系统中获取内存。 2. 在多线程环境下每一个线程都可以他自己完全独立栈,但是他们共享堆。并行存取被堆控制而不是栈。 堆: 1....不可以函数活动记录(即局部或者自动变量)被分配在栈上, 这样做不但存储了这些变量,而且可以用来嵌套函数追踪。

75290

go语言调度器源代码情景分析之四:函数调用栈

操作系统把磁盘上可执行文件加载到内存运行之前,会做很多工作,其中很重要一件事情就是把可执行文件中代码,数据放在内存中合适位置,并分配初始化程序运行过程中所必须堆栈,所有准备工作完成后操作系统才会调度程序起来运行...栈生长收缩都是自动,由编译器插入代码自动完成,因此位于栈内存中函数局部变量所使用内存随函数调用而分配,随函数返回而自动释放,所以程序员不管是使用垃圾回收还是没有垃圾回收高级编程语言都不需要自己释放局部变量所使用内存...; CPU硬件寄存器rsp指向整个栈栈顶,当然它也指向C函数栈帧栈顶,而rbp寄存器指向是C函数栈帧起始位置; 虽然图中ABC三个函数栈帧看起来都差不多大,但事实上在真实程序中,每个函数栈帧大小可能都不同...从上图可以看出,即使是同一个函数,每次调用都会产生一个不同栈帧,因此对于递归函数,每递归一次都会消耗一定栈内存,如果递归层数太多就有导致栈溢出风险,这也是为什么我们在实际开发过程中应该尽量避免使用递归函数原因之一...,另外一个原因是递归函数执行效率比较低,因为它要反复调用函数,而调用函数较大性能开销。

1.1K10

C语言面试题汇总(持续更)「建议收藏」

} 放在常量区,编译器可能会将它与p3所指向"123456"优化成一个地方。 } 2. 存储类(内存管理): ①栈:局部变量,函数调用传参过程。...因为A、B、C是外部变量 所以调用max函数时用不到参数传递,即在max函数中可以直接使用外部变量A、B、C值 (这一点与局部变量个实参传给形参过程不同) 二、堆什么区别?...(为什么又是这个) 1、堆栈空间分配区别 栈(操作系统):由操作系统编译器)自动分配释放 ,存放函数参数值,局部变量值等。其操作方式类似于数据结构中栈。...五、杂项 1. constdefine区别 1.数据类型:const修饰变量明确类型,而宏没有明确数据类型 2.安全方面:const修饰变量会被编译器检查,而宏没有安全检查 3.内存分配:...#include” “:查找当前目录是否指定名称头文件,然后再从标准头文件目录中查找。 7.递归 每个递归必须至少有一个条件,其满足时递归便不再运行,即:此时不再引用自身,而是返回值退出。

62830

JVM内存模型

内容显示 全球概览 JVM 是底层操作系统抽象。它确保无论 JVM 在什么硬件操作系统上运行,相同代码都将以相同行为运行。...无论底层操作系统/硬件是大端还是小端,每个 JVM 都以大端顺序(高字节在前)存储使用内存中数据。 注意:有时,JVM 实现行为与另一个不同,但通常是相同。...虽然它对开发人员来说是不可见,但它对生成字节码 JVM 架构巨大影响,这就是为什么将简要解释这个概念原因。...从值 0x85 到 0x93 比较:用于两个值之间基本比较。从值 0x94 到 0xa6 控制:基本操作, goto、return ……允许更高级操作,循环或返回值函数。...方法区存储: 类信息(字段/方法数量、超类名称、接口名称、版本……) 方法构造函数字节码。 每个加载类都有一个运行时常量池。 规范不强制在堆中实现方法区。

77440

从零开始学习UCOSII操作系统13–系统移植理论篇「建议收藏」

大家好,又见面了,是你们朋友全栈君。 从零开始学习UCOSII操作系统13–系统移植理论篇 1、什么是系统移植?...(2)要使用UCOSII正常运行,处理器必须满足以下条件 2.1、处理器C编译器能产生可重入型代码 原因:如果不行的话,那么就不能在任务之间随意切换,因为当你切换到别的任务时候,该任务在这个函数数据就会被破坏...2.4、处理器能够支持一定数量数据存储硬件堆栈,也就是栈 2.5、处理器堆栈指针以及其他CPU寄存器内容读出,并存储堆栈或者内存中去指令。...,应该是没有什么执行,但是我们UCOSII系统,规定当没有任何任务需要强占CPU时候,我们应该让其进入低功耗模式,真的设计很好。...} (3)OSTickISR() UCOSII要求用户提供一个周期性时钟源,来实现时间延迟超时功能,时钟节拍应该每秒发生10或者100次每秒,为了完成任务,可以使用硬件定时器,也可以从交流电中获得

53420

MIPS架构深入理解2-MIPS架构体系

在MIPS32/64规范之前,已经发布了多版MIPS架构。但是,这些旧架构只是规定了软件使用指令资源,并没有定义操作系统所需要CPU控制机制,而是将其认为应该在实现时定义。...4..7:(a0-a3)用来传递前四个参数给子程序,不够堆栈。a0-a3v0-v1以及ra一起来支持子程序/过程调用,分别用以传递参数,返回结果存放返回地址。...当需要使用更多寄存器时,就需要堆栈了,MIPS编译器总是为参数在堆栈中留有空间以防参数需要存储。 8..15:(t0-t7)临时寄存器,子程序可以使用它们而不用保留。...编译器通常产生额外指令检查错误并捕捉错误,比如说除零操作。 指令mthimtlo,用来拷贝通用目的寄存器值到内部寄存器中。...当然,这不适用于C函数中定义变量,因为它们要么是在寄存器中,要么在堆栈上。

5.4K20

C语言执行效率如何保证?

01 C代码执行效率与哪些因素有关 C代码执行效率与时间复杂度空间复杂度有关: 1、空间复杂度是指算法在计算机内执行时所需存储空间度量 2、一般情况下,算法中基本操作重复执行次数是问题规模n某个函数...大家要知道是,函数调用是要使用系统栈来保存数据,如果编译器栈检查选 项,一般在函数头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存恢复当前现场,进行压栈弹栈操作...在计算机程序中数据位是可以操作最小数据单位,理论上可以用"位运算"来完成所有的运算操作。一般位操作是用来控制硬件,或者做数据变换使用,但是,灵活位操作可以有效地提高程序运行效率。...,在自带硬件乘法器AVR单片机中,ATMega163中,乘法运算只需2个时钟周期就可以完成。...事实上,C编译器们对优化递归调用一点都不反感,相反,它们还很喜欢干这件事。只有在递归函数需要传递大量参数,可能造成瓶颈时候,才应该使用循环代码,其他时候,还是用递归好些。

6.1K108

iOS内存详解

栈区(Stack) 高地址向低地址扩展系统数据结构,对应进程或者线程是唯一 是一块连续内存区域,遵循先进后出(FILO)原则 运行时分配,在iOS中以0x7开头 由编译器自动分配并释放,主要用来存储...:局部变量、函数参数(隐藏参数(id self, SEL _cmd)) 优缺点 优点:因为栈是编译器自动分配并释放,不会产生内存碎片,快速且高效 缺点:栈内存大小有限制,数据不灵活, iOS主线程大小是...在iOS中以0x6开头 程序员动态分配释放,如果程序员没有释放,在程序结束后由系统回收,主要用来存储:开辟空间创建对象 访问堆中内存时,一般需要通过对象读取到栈区指针地址,然后通过指针地址访问堆区...,每执行一次函数调用就会生成一个新栈帧,然后将其压入函数栈,当函数执行结束时,则将函数对应栈帧出栈并释放 堆栈溢出 一般情况下我们是不需要考虑堆栈大小问题,但是堆栈不是无上限,过多递归会导致栈溢出...,过多alloc会导致堆溢出 预付堆栈溢出方法: 避免层次过深得递归调用 不要使用过多局部变量,控制局部变量大小 避免占用大内存对象分配,及时释放 在适当情况下调用系统API修改线程堆栈大小

60820

编程能力七段论

“框架”就是注册回调函数到框架,框架来调用函数。   另一个坎就是面向对象。很长一段时间都不知道应该怎么设计类类之间关系,不能很好设计出类层次结构来。   ...记得当时看到一本外国大牛书,他讲了一个很简单、很实用面向对象设计技巧:“叙述问题。然后把其中名词找出来,用来构建类。把其中动词找出来,用来构建类方法”。...多大牛极力鼓吹过函数式编程语言,认为其极具革命性。但我认为他们过高估计了函数式编程范式威力,并不认为函数式编程范式相对于面向对象编程范式何高明之处。   ...函数式编程语言,还有尾递归等一些小技巧。尾递归可以不用栈,防止递归调用时栈溢出。   模板编程范式   模板编程,就是把类型作为参数,一套函数可以支持任意多种类型。代表语言:C++。   ...一些C++高手又在模板基础上搞出了“模板元编程”。因为模板编程,就是C++编译器搞定嘛,模板元编程就是让编译器运算,编译完结果也就算出来了。不知道除了研究炫技,这玩意啥用?

1.1K50

iOS 内存概述

)原则 运行时分配,在iOS中以0x7开头 由编译器自动分配并释放,主要用来存储:局部变量、函数参数(隐藏参数(id self, SEL _cmd)) 优缺点 优点:因为栈是编译器自动分配并释放,...,类似链表结构(便于增删,不便于查找),遵循先进先出(FOFI)原则 运行时分配,在iOS中以0x6开头 程序员动态分配释放,如果程序员没有释放,在程序结束后由系统回收,主要用来存储:开辟空间创建对象...函数调用是发生在栈上,每一个函数相关信息(局部变量,调用记录等)都存储在一个栈帧中,每执行一次函数调用就会生成一个新栈帧,然后将其压入函数栈,当函数执行结束时,则将函数对应栈帧出栈并释放 堆栈溢出...一般情况下我们是不需要考虑堆栈大小问题,但是堆栈不是无上限,过多递归会导致栈溢出,过多alloc会导致堆溢出 预付堆栈溢出方法: 避免层次过深得递归调用 不要使用过多局部变量,控制局部变量大小...避免占用大内存对象分配,及时释放 在适当情况下调用系统API修改线程堆栈大小

43900

5.1 缓冲区溢出与攻防博弈

在大致弄清楚缓冲区溢出攻击之后,这里总结了攻防双方对抗博弈过程,攻击者与防御者对抗博弈斗争从来都没有停止过,在大环境下防御始终落后于攻击,但不论如何正是因为攻防双方对抗,才使得系统安全水平呈现螺旋式上升态势...具体来说,编译器会在程序函数调用前后分别插入一个称为"Prolog""Epilog"代码段,在这些代码段中会包含一些额外栈空间检测代码。...GS保护机制是微软堆栈检测仪概念具体实现,从Visual Studio系列编译器上就加入了GS保护机制且默认开启,操作系统从WindowsXP开始就已经全面支持该选项了。...在Windows操作系统中,SEH信息是存储在栈上,因此可以被利用来进行缓冲区溢出攻击。...因此,在设计安全应用程序时,应该综合考虑多种防御措施,而不是仅仅依赖于单一防御措施。

30840

5.1 缓冲区溢出与攻防博弈

在大致弄清楚缓冲区溢出攻击之后,这里总结了攻防双方对抗博弈过程,攻击者与防御者对抗博弈斗争从来都没有停止过,在大环境下防御始终落后于攻击,但不论如何正是因为攻防双方对抗,才使得系统安全水平呈现螺旋式上升态势...具体来说,编译器会在程序函数调用前后分别插入一个称为"Prolog""Epilog"代码段,在这些代码段中会包含一些额外栈空间检测代码。...GS保护机制是微软堆栈检测仪概念具体实现,从Visual Studio系列编译器上就加入了GS保护机制且默认开启,操作系统从WindowsXP开始就已经全面支持该选项了。...在Windows操作系统中,SEH信息是存储在栈上,因此可以被利用来进行缓冲区溢出攻击。...因此,在设计安全应用程序时,应该综合考虑多种防御措施,而不是仅仅依赖于单一防御措施。

18620

硬钢百度面试!

大家好,是小林。 今天分享一位百度春招面经,读者技术栈是C++。 这次面经,主要都是问操作系统、网络编程、C++ 这三大方向。...寄存器栈,而一个进程里可以多个线程,彼此共享同一个地址空间。...创建时间少)线程创建时间比进程快,因为进程在创建过程中,还需要资源管理信息,比如内存、文件管理信息切换虚拟地址空间,切换内核栈硬件上下文,页表切换开销很大,而线程在创建过程中,不会涉及这些信息,...一个只包含int 变量空class只包含int变量空struct内存各占多大? 关键词:空类空结构体都大小为1,这样可以确保两个不同对象,拥有不同地址。...从使用角度:虚函数作用在于通过父类指针或者引用来调用它时候能够变成调用子类那个成员函数

16020

STM32编程:是时候深入理解栈了

栈就两种操作: PUSH,压栈,向栈内加入数据, POP,出栈 再进一步探讨: 首先将栈与堆分清,从看到这篇文章开始,建议你不要把堆栈连在一起叫,栈是栈,堆是堆,这是两回事,别混为一谈!...不同点: 栈:由编译器分配,存放函数参数值,局部变量,寄存器组(不同单片机/处理器各有不同)、函数调用参数传递、中断异常产生时须保存处理器状态寄存器值等 堆:由程序员分配释放,对于C而言,malloc...FIQ FIQ_STACK 用于高速(FIQ)中断处理程序堆栈。 Undefined UND_STACK 堆栈用于未定义指令中断。 支持硬件协处理器指令集扩展软件仿真。...Abort ABT_STACK 用于指令获取和数据访问存储器中止中断处理程序堆栈。...通过上面递归调用测试,还可以得到一个启示,嵌入式编程函数嵌套层级不宜过深,过深则需要相对较大栈开销。

99600

ABI 与 API 区别

影响 ABI 因素非常多,硬件、编程语言、编译器、链接器、操作系统等都会影响 ABI。我们以 C 语言为例,来看编程语言是如何影响 ABI 。...对于 C 语言目标代码来说,以下几个方面会决定目标文件之间是否二进制兼容: (1)内置数据类型( char、int、float 等)大小和在存储器中存放方式(大端、小端、对齐方式等); (2...比如,POSIX 标准,C99 标准等都是对 API 规定。其中,POSIX 标准是不同操作系统 API 标准,POSIX 标准定义了类 Unix 操作系统应该为应用程序提供接口。...API 是一种源代码级别的接口,同一个 API,在不同平台(不同操作系统硬件平台)具体实现方式可能不同,但是接口形式功能必须一致,这样就能够保证使用统一接口实现跨平台开发。...ABI 规定了二进制文件格式、内容、装载/卸载程序要求、函数调用时参数传递规则、寄存器、堆栈使用;API 规定操作系统硬件平台、服务组件、语言函数库等需要提供功能函数接口; 作用层面不同

1.5K20

【自动编译代码】陈天奇团队TVM重磅更新:直接在浏览器使用GPU

使用5年历史8核英特尔®酷睿™i7-3610QM笔记本电脑,以及一个GTX650M。 在这个基准测试中,我们从Gluon模型库里下载了resnet18模型,并对猫图像进行端到端分类。...TVM:一个端到端优化堆栈 可扩展框架,TensorFlow,MXNet,CaffePyTorch是目前深度学习领域最流行实用框架。...该编译器基础结构已经开源。 ? 图4:CPU、GPU与TPU类加速器需要不同片上存储架构计算基元。在生成优化代码时我们必须考虑这个问题。...我们提出TVM,一个端到端优化编译器堆栈(如图5所示),它能降低微调深度学习工作负载,以适应多种硬件后端。...这一额外分离可以支持新专用加速器及其相应内部函数。 ? 图5:TVM 堆栈图。目前堆栈支持多种深度学习框架以及主流 CPU、GPU 以及专用深度学习加速器。

1.8K50

Java中堆(heap)栈(stack)区别

简单说: Java把内存划分成两种:一种是栈内存,一种是堆内存。   在函数中定义一些基本类型变量对象引用变量都在函数栈内存中分配。...这种分配策略要求程序代码中不允许可变数据结构(比如可变数组)存在,也不允许嵌套或者递归结构出现,因为它们都会导致编译程序无法计算准确存储空间需求。   ...堆比较   上面的定义从编译原理教材中总结而来,除静态存储分配之外,都显得很呆板难以理解,下面撇开静态存储分配,集中比较堆栈:   从堆功能用来通俗比较,堆主要用来存放对象,...从Java这种分配机制来看,堆栈又可以这样理解:堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程操作系统中是线程)为这个线程建立存储区域,该区域具有先进后出特性。...想法是(应该说代表TIJ观点),如果没有Garbage Collector(GC),上面的说法就是成立

1.7K51
领券