简单理解动态内存分配和静态内存分配的区别

在涉及到内存分配时,我们一般都要考虑到两种内存分配方式,一种是动态内存分配,另一种是静态内存分配,我们该怎么理解这两者的区别呢?

在我看来,静态内存分配和动态内存分配比较典型的例子就是数组和链表,数组的长度是预先定义好的,在整个程序中是固定不变的,所以他在内存分配时是以静态内存分配的方式进行的。而链表,它的信息有可能会随时更改,内存的分配取决于我们实际输入的数据,这样就用到了动态内存分配的方式。

静态内存分配是在程序编译或者运行过程中,按事先规定的大小分配内存空间的分配方式,他的前提的必须事先知道所需内存空间的大小,它的内存分配在栈区和全局变量区。

动态内存分配是按输入信息的大小分配所需要的内存单元,他的特点是按需分配,内存分配在堆区。

为了便于理解我们来举个小例子,静态内存分配和动态内存分配的方式我们可以比作我们去旅游,旅游之前沃恩肯定要做的事情是带好钱,现在我们有两种带钱的方式,一种是一次性的带足够的钱,另一种是先带一点钱,足够我们买飞机票到达旅游的地点,当我们看到什么需要买的东西时,打电话给自己的亲人或者朋友,让他们给你打过你足够买你需要东西的钱。我们可以看到,你要是只要一次钱,你只能是提前做好预算,只能是比你计划的所需要的钱要多,而且只能多不能少,否则的话,你到了旅游的地方将不能再回到你的家,这是一点。而需要多少钱就让亲朋好友打多少钱的方式在我们看来很是笨重,但是我们这里只是要说明动态内存分配的特点,动态内存分配是按照我们需要多少钱就给我们送多少钱。

在这里我们可以考虑一下两者的执行速率和内存空间分配的问题,由上面的例子我们可以很直白的看出,静态内存分配比动态内存分配的速率要高不少,但是我们也看到,静态内存分配的方式有可能会有内存剩余也就是有可能会有我们不使用的内存空间,这样就造成了内存的浪费。

时间: 2024-08-13 14:08:40

简单理解动态内存分配和静态内存分配的区别的相关文章

2016 - 2 - 16 动态内存分配与静态内存分配

一 静态内存分配 1.  C语言的全局变量.静态局部变量的存储实在编译时确定的,其存储的空间的实际分配在程序开始执行前完成. 2. 在栈上创建的,比如局部自动变量,在执行进入变量定义所在的复合语句时为他们分配存储单元.栈内存分配运算内置于处理器的指令集中 ,效率很高,但是分配的内存容量有限. 以静态方式安排存储的好处主要是实现比较方便,效率高, 二 动态内存分配 1.  从堆上分配,亦称动态内存分配 .程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 fr

Linux下动态库(.so)和静态库(.a) 的区别

静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库.编译之后程序文件大,但加载快,隔离性也好.动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在.多个应用程序可以使用同一个动态库,启动多个应用程序的时候,只需要将动态库加载到内存一次即可. 编译动态库: -shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接.相当于一个可执行文件-fPIC:表示

动态注册广播和静态注册广播的区别

广播接收器注册一共有两种形式 : 静态注册和动态注册. 两者及其接收广播的区别: 1.动态注册的广播永远要快于静态注册的广播,不管静态注册的优先级设置的多高,不管动态注册的优先级有多低. 2.动态注册广播不是常驻型广播,也就是说广播跟随activity的生命周期.注意: 在activity结束前,移除广播接收器. 静态注册是常驻型,也就是说即使app已经退出,主要有相应的广播发出,依然可以接收到,但此种描述自Android 3.1开始有可能不再成立. 详情请关注 http://www.cnblo

Java静态内存与动态内存分配的解析

1. 静态内存 静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源. 程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会 自动释放所占用的内存空间. 变量的分配与释放,都无须程序员自行考虑. eg:基本类型,数组 2. 动态内存 用户无法确定空间大小,或者空间太大,栈上无法分配时,会采用动态内存分配. 3. 区别 a) 静态内存分配在编译时完成,不占用CPU资源; 动态内存分配在运行时,分配与释放都占用

深入理解JVM-垃圾收集器与内存分配策略

在上面一篇文章中,介绍了java内存运行时区域,其中程序计数器.虚拟机栈.本地方法栈3个区域随线程生灭:栈中的栈帧随着方法的进入和退出而有条不紊的执行着进栈出栈的操作,每一个栈帧中分配着多少内存基本上是在类结构确定下来就已知的,因此这几个区域的内存的分配和回收都具有确定性.在方法接受时内存就已经回收了.java堆和好方法区则不一样,一个接口的多个实现类需要的内存可能不一样,一个方法的多个分支需要的内存也可能不一样,我们只有在程序运行时才能知道需要创建哪些对象.这部分内存的分配和回收都是动态的,垃

深入理解java虚拟机----->垃圾收集器与内存分配策略(下)

1.  前言 内存分配与回收策略 JVM堆的结构分析(新生代.老年代.永久代) 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保  2.  垃圾收集器与内存分配策略 Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题: 给对象分配内存; 回收分配给对象的内存. 对象的内存分配,往大方向上讲就是在堆上的分配,对象主要分配在新生代的Eden区上.少数也可能分配在老年代,取决于哪一种垃圾收集器组合,还有虚拟机中的相关内存的参

[深入理解Java虚拟机]<垃圾收集器与内存分配策略>

Overview 垃圾收集考虑三件事: 哪些内存需要回收? 什么时候回收? 如何回收? 重点考虑Java堆中动态分配和回收的内存. Is Object alive? 引用计数法 给对象添加一个引用计数器. 该方法实现简单,判定效率高.但是它很难解决对象之间相互循环引用的问题,因此几乎很少有JVM选用该方法.eg: public class ReferenceCountingGC { public Object instance = null; // 占点内存,以便在GC日志中看清楚是否被回收过

C之静态内存和动态内存

静态内存: * 自动申请,自动释放* 大小固定,内存空间连续* 从栈上分配的内存叫静态内存 动态内存: * 程序员自己申请 * new/malloc* 大小取决于虚拟内存的大小,内存空间不连续* java中自动回收,C中需要程序员使用free函数手动释放* 从堆上分配的内存叫动态内存 (1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static 变量. (2) 在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数

动态内存与静态内存的区别

1. 静态内存 静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源. 程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会 自动释放所占用的内存空间. 变量的分配与释放,都无须程序员自行考虑. eg: 基本类型,数组 2. 动态内存 用户无法确定空间大小,或者空间太大,栈上无法分配时,会采用动态内存分配. 3. 区别 a) 静态内存分配在编译时完成,不占用CPU资源; 动态内存分配在运行时,分配与释放都占