数据结构和算法学习四,之内存
void process() { char* point = (char*)malloc(100); free(point); }
引自:http://blog.csdn.net/feixiaoxing/article/details/6839301
内存是程序运行的基础。所有正在运行的代码都保存在内存里面。内存需要处理各种各样的数据,包括键盘的数据、鼠标的数据、usb的数据、串口的数据、摄像头的数据,那么这些数据经过程序的处理之后,就要进行输出到串口、屏幕、usb等。
内存只有一个,但是程序里面的空间有很多种。但是内存中的数据类型只有几种,比如说全局中的数据、堆中的数据、临时堆栈中的数据。那么他们有什么区别呢?我们可以通过代码发现一些问题。
(1)全局数据
static int value = 100; void process() { static int number = 10; }
大家可以在这里看到,value和number的数据其实都属于全局数据,这里的变量是不随着函数的调用发生变化的。
(2)堆数据
void process() { char* point = (char*)malloc(100); free(point); }
这里的point分配的数据就是堆数据,如果没有free操作,那么它的存在也是全局的。只要内存不主动释放,那么这个内存就会以一直存在。
(3)临时数据
void process() { char name[100] = {0}; return; }
这里的数据都是堆栈内部的数据,一旦process调用结束返回之前,那么name地址指向的内存空间已经被其他函数使用。此时这段内存空间对我们来说已经没有什么意义了。所以,不管在函数里面用了多少空间,如果你想在函数返回之前继续使用里面的数据,务必在函数返回前拷贝完毕。
这篇博客的内容比较简单,主要讲述了内存的一些内容。其实关于内存的东西还很多。这里说明一下只是让大家有一个了解:
1) 全局数据是我们喜欢使用的类型,用起来比较方便
2)堆数据是系统给我们安排的空间
3)堆栈空间只能存在于当时的函数之中,函数返回即失去意义
虽然我们上面这么说,但是这三个概念有的时候也是可以相互迁移的,比如说:
1) 有的时候,我们为了测试的需要,首先构建一个全局内存池,以后测试的内存都是通过自定义的malloc在内存池中分配的,所以这个时候,堆分配和全局联系在了一起。
全局内存空间 < =========> 内存池 < =========> 本地空间分配
2) 如果我们使用的函数空间比较小,那么所有的操作就可以在一个函数内部完成了,那么这时候全局空间和临时堆栈是不是一致的呢
全局空间 < =============> 本地堆栈
上面的说法有些绕,但是我们的目的只是想让大家时刻明白:
a)必须时刻明白我们的数据在哪块空间里面
b)内存会不会越界
c)内存会不会泄露
d)内存访问的数据是否依然有效
【预告: 下面的博客开始介绍线性空间的内容】
相关文章
- eclispe 出现超内存错误
- 一次完整的JVM堆外内存泄漏故障排查记录
- Atitit.提升稳定性-----分析内存泄漏PermGen OOM跟解决之道...java
- 【操作系统笔记04】操作系统之内存管理方式(分页、分段、段页式)、虚拟存储技术、页面置换算法
- 图文详解: 操作系统之内存管理 ( 内存模型,虚拟内存,MMU, TLB,页面置换算法,分段等)...
- 【Linux 内核 内存管理】引导内存分配器 bootmem ③ ( bootmem 引导内存分配器算法 | 低端内存映射 | 内存记录位图 | 最先适配算法 | 内存分配记录 | 内存操作函数 )
- 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 )
- 【Android 热修复】热修复原理 ( 加载 Dex 文件到内存中 | DexClassLoader | PathClassLoader | 反射 Element[] dexElements )
- 【Android 内存优化】垃圾回收算法 ( 分代收集算法 | Serial 收集器 | ParNew 收集器 | Parallel Scavenge 收集器 | CMS 并发标记清除收集器 )
- 【Android 内存优化】Java 内存模型 ( Java 虚拟机内存模型 | 线程私有区 | 共享数据区 | 内存回收算法 | 引用计数 | 可达性分析 )
- Linux 进程 cpu 使用排序 内存 使用排序
- DenseNet算法详解——思路就是highway,DneseNet在训练时十分消耗内存
- ffmpeg内存管理av_malloc相关
- RK3399平台开发系列讲解(内存篇)15.9、内存泄漏排查方法
- Linux 关于内存最疑惑的几个问题
- 【OSTEP】超越物理内存的策略 | Belady现象 | LRU策略 | 引用位算法 | 抖动(Trashing) | 全局替换与局部替换 | 预读 | 群集与分组