内存管理之栈stack
栈是一种数据结构,C语言中使用栈来保存局部变量。栈是被发明出来管理内存的。
2、栈管理内存的特点(小内存、自动化)
先进后出 FILO first in last out 栈
先进先出 FIFO first in first out 队列
栈的特点就是入口就是出口,只有一个口,另一个口是堵死的。所以先进来的必须后出去。
队列的特点就是入口和出口都有,必须从入口进去,从出口出来。所以先进来的必须先出去,不然就会堵住后边的。
3、栈的应用举例:局部变量
C语言中的局部变量是用栈来实现的。
我们在C语言中定义一个局部变量时(int a),编译器就会在栈中分配一段空间(4字节)给我们局部变量使用(分配时
栈顶指针会移动给出空间,给局部变量a使用的意思就是,将4个字节的栈内存的内存地址和我们定义的局部变量名a给关联
起来),对应栈的操作就是入栈。
注意:这里栈指针的移动和内存分配是自动的(栈自己完成,不用我们写代码去操作)。
然后等我们函数退出的时候,局部变量要灭亡。对应栈的操作就是弹栈(出栈)。出栈时也是栈顶指针移动将栈空间中
与a关联的那4个字节空间释放。 这个动作也是栈自动完成的,也不用人写代码干预。
分析一个细节:C语言中,定义局部变量如果没有初始化,则值是随机的,为什么?
定义一个局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间
在栈上,而栈内存是反复使用的(也就是上次用完没有清零),所以说使用栈来实现的局部变量定义时,如果没有初始化,
那么变量的值就是随机的。
C语言是通过一个小手段来实现局部变量初始化的:
int a = 15; //局部变量定义时初始化
C语言编译器会自动把这行代码转换成:
int a; //局部变量定义
a = 15; //普通的赋值语句
4、栈的约束
首先,栈是有大小的。所以栈内存大小不好设置。如果太小怕溢出,太大怕浪费内存。(这个缺点有点像数组)
其次,栈的溢出危害是很大的,所以我们一定要避免。在定义局部变量的时候不能定义的太多或者是太大。(譬如:
int a[10000];使用递归来解决问题时一定要注意递归收敛)
内存管理之栈stack的更多相关文章
- 解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法
堆区:专门用来保存对象的实例(new 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中) 1.存储的全部是对象 ...
- 面试01:解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法
栈的使用:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间. 队的使用:通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域 ...
- java - 解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法
通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间: 而通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收 ...
- 解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法?
通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用JVM中的栈空间:而通过new关键字和构造器创建的对象则放在堆空间,堆是垃圾收集器管理的主要区域,由于现在的垃圾收集 ...
- 解释内存中的栈(stack)、堆(heap)和方法区(method area) 的用法?
通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的 现场保存都使用 JVM 中的栈空间:而通过 new 关键字和构造器创建的对象则放在 堆空间,堆是垃圾收集器管理的主要区域,由于现 ...
- 栈 & 堆 |--> 内存管理
内存管理: 栈区 [stack]:由编译器自动分配并释放,一般存放函数的参数值,局部变量等 堆区 [heap]:由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 全局区(静态区) ...
- iOS-Objective-C内存管理
内存管理: 栈区 [stack]:由编译器自动分配并释放,一般存放函数的参数值,局部变量等 堆区 [heap]:由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 全局区(静态区) ...
- 全面介绍Windows内存管理机制及C++内存分配实例
转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...
- 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...
随机推荐
- Adapter之ArrayAdapter以及监听器设置
前言: ArrayAdapter:支持泛型操作,最简单的一个Adapter,只能展现一行文字~,我的学习就是通过这个最简单的适配器开始 正文: 完成这个ArrayAdapter需要三步:1.初始化数据 ...
- netty权威指南学习笔记七——编解码技术之GoogleProtobuf
首先我们来看一下protobuf的优点: 谷歌长期使用成熟度高: 跨语言支持多种语言如:C++,java,Python: 编码后消息更小,更利于存储传输: 编解码性能高: 支持不同协议版本的兼容性: ...
- Oracle的操作经验
采用Oracle进行sql语句 建表并设置主键,主键自增,某一字段唯一性约束等 <---如果表存在则删除---> declare num number; begin select coun ...
- windows查看所有进程:netstat -ano
windows查看所有进程:netstat -ano ------------------------------------------------------------------------- ...
- JavaScript 对象所有API解析【2020版】
JavaScript 对象所有API解析[2020版] 写于 2019年08月20日,虽然是2019年写的文章,但现在2020年依旧不过时,现在补充了2019年新增的ES10 Object.fromE ...
- 十八、JavaScript之布尔类型
一.代码如下 二.运行效果 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" conten ...
- 111-PHP类变量之间的赋值标识为同一个对象
<?php class mao{ //定义猫类 public $age=0; //定义多个属性并初始化 public $weight=50; public $color='white'; } $ ...
- 实现Comparator 对List<?>进行排序
首选需要有个Entity类 ,里面有属性有方法 package demo; public class Entity { private String empNo ; private String em ...
- 如何为 .NET Core 安装本地化的 IntelliSense 文件
在.Net Core 2.x 版本,Microsoft 官方没有提供 .Net Core 正式版的多语言安装包.因此,我们在用.Net Core 2.x 版本作为框架目标编写代码时,智能提成是英文的. ...
- TX2--安装跑一python3.5
sudo add-apt-repository ppa:webupd8team/javasudo apt-get updatesudo apt-get install oracle-java8-ins ...