您的位置:首页 > 编程语言 > C语言/C++

关于C/C++的内存管理

2008-11-17 09:22 127 查看
以前从事上位机程序代码的编写,压根不用很具体的考虑变量的具体存放位置,只知道以下概念就行了:
1. 堆区( heap ):由程序员申请分配和释放,属动态内存分配方式,变量存放于动态存储区,若程序员不释放,程序结束时可能会由 OS 回收。不过这个内存分配很容易引起问题,如果申请的内存不释放就会造成内存泄漏;如果释放的不是所要释放的内存,则轻者引起程序运行结果出错,重者系统崩溃。在C/C++语言中就是用malloc和free(C++常用new和delete)申请和释放的内存。
2.栈区( stack ):编译器自动分配释放,存放函数的形参值、局部变量的值,也是属于动态内存分配方式,存放位置也为动态存储区,它由系统分配,所以执行效率也高,不过自由度小,声明时就得决定其具体大小。
3.全局区(静态区)( static ):全局变量和静态变量的存储是放在一块的,属于静态存储区,而且初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放,所以也不会造成内存问题。
除了以上的变量外,还有两类存放位置,文字常量区和程序代码区,两者都是由系统分配和释放,且文字常量区和前面三区合成为程序数据区,与程序代码区相对应。
以上所讲的内存,都只是RAM而并非ROM,因为在上位机编程中我们不可能去动内存储器的ROM,通常说的内存条就是RAM。(记得上周跟华为的人面试,还在那边胸有成竹地讲RAM和ROM呢,现在想来真是惭愧得很)

现在工作中用到MSP430的Flash类型的mcu,在编程时考虑就不能那样迷迷糊糊的了,首先mcu给的RAM毕竟有限,能到4K已经很贵了,为此很多变量像表格数据之类的必须和程序一起放到ROM中去。
我用到的IAR的EWB for 430的编译器,它内在规定就是加const 定义的变量和代码段被放到ROM中,全局(以及静态)变量和局部变量的位置仍然在RAM中,这些量显然掉电时也是会跟着掉的。不是说const的定义的是“常量”吗,是不能更改的啊,但是我要用到的变量是要更改的,那该怎么办呢?不错我们在程序中是不能直接进行修改这些数据量了,但是可以通过写flash操作来对其进行修改。也许有人会觉得我大惊小怪,大概因为我以前学单片机不够用心吧,总之到现在用的时候才知道些ROM和RAM的确切不同。
上面提到的const定义的“常量”及其它具体的关于const在C/C++语言中的用法,可以参看Effictive C++和More Effictive C++以及网络上其它人的总结。以下给出一些别人总结的转载,我觉得还是蛮有益。如果有侵权,请通知本人


1. 内存储器
1. 内存的基本概念
内存(内存储器)是微型计算机主机的组成部分,用来存放当前正在使用的或随时要使用的程序或数据。
CPU可以直接访问内存。
微机以字节为单位线性地组织内存储器,每个存储单元(一个字节)都有一个唯一的编号。24位地址总线可以提供的地址编号为224=16M字节。
内存储器按其工作特点分为:只读存储器ROM(Read-Only Memory)和随机存取存储器RAM(Random Access Memory)。
2. RAM的种类
① 动态内存DRAM(Dynamic RAM):需要周期性地给电容充电(刷新)。这种存储器集成度较高、价格较低,但由于需要周期性地刷新,存取速度较慢。一种叫做SDRAM的新型DRAM,由于采用与系统时钟同步的技术,所以比DRAM快的多。当今,多数计算机用的都是SDRAM。
② 静态内存SRAM(Static RAM):静态RAM是利用双稳态的触发器来存储"1"和"0" 的。"静态"的意思是指它不需要像DRAM那样经常刷新。所以,SRAM比任何形式的DRAM都快得多,也稳定得多。但SRAM的价格比DRAM贵得多,所以只用在特殊场合(如高速缓冲存储器Cache)。
3. 内存条
内存集成电路比CPU芯片小一些,通常封装在一条形电路板上,俗称内存条。
4. 高速缓冲存储器
为提高CPU的处理速度,当今计算机中大都配有高速缓冲存储器(cache),也称缓存,实际上是一种特殊的高速存储器。
缓存的存取速度比内存要快,所以就提高了处理速度。
多数现代计算机都配有两级缓存。
一级缓存也叫主缓存,或内部缓存,直接设计在CPU芯片内部。一级缓存容量很小,通常在8KB ~ 64KB之间。
二级缓存也叫外部缓存,不在CPU内部而是独立的SRAM芯片,其速度比一级缓存稍慢,但容量较大,多在64KB ~ 2MB之间。人们讨论缓存时,通常是指外部缓存。
当CUP需要指令或数据时,实际检索存储器的顺序是:首先检索一级缓存,然后二级缓存,再往后是RAM。
5. 只读存储器
只读存储器(Read Only Memory,缩写ROM)不能写入而只能读出数据,其中的信息是在制造时一次写入的。
只读存储器常用来存放固定不变、重复使用的程序、数据或信息,如存放汉字库、各种专用设备的控制程序等。最典型的是ROM BIOS(基本输入/输出系统),其中部分内容适用于启动计算机的指令,内容固定但每次开机时都要执行。存储在ROM中的指令叫微程序,这样的ROM成为固件。
其他形式的只读存储器
① 可编程只读存储器PROM(Programmable ROM):一种空白ROM,用户可按照自己的需要对其编程。输入PROM的指令叫作微码,一旦微码输入,PROM的功能就和普通ROM一样,内容不能消除和改变。
② 可擦除的可编程的只读存储器E-PROM(Erasable Programmable ROM),可以从计算机上取下来,用特殊的设备擦除其内容后重新编程。
③ 闪存(flash)ROM,它不像PROM、EPROM那样只能一次编程,而是可以电擦除,重新编程。闪存ROM常用于个人电脑、蜂窝电话、数字相机、个人数字助手等,其容量在1 ~ 40MB之间。
6. CMOS存储器
CMOS(Complementary metal oxide)互补金属氧化物半导体
计算机需要保存一些配置信息,如硬盘驱动器和键的类型;日期、时间以及其它启动计算机所需要的信息等。他们不需要频繁变化,又不能一成不变,需要时(升级或更换设备)要适当变化。
CMOS存储器可以满足这种要求。计算机关机后仍能维持其中存储的信息。COMS中的信息可以改变,比如计算机更换硬盘之后,可以通过执行CMOS配置程序与机器交互,更改CMOS中的信息。
2. 外存储器
外存储器一般不直接与微处理器打交道,外存中的数据应先调入内存,再由微处理器进行处理。为了增加内存容量,方便读写操作,有时将硬盘的一部分当做内存使用,这就是虚拟内存。虚拟内存利用在硬盘上建立"交换文件"的方式,把部分应用程序(特别是己闲置的应用程序)所用到的内存空间搬到硬盘上去,以此来增加可使用的内存空间和弹性;当然,容量的增加是以牺牲速度为代价的。交换文件是暂时性的,应用程序执行完毕便自动删除。
磁盘存储器 有以下三部分组成: ①软磁盘驱动器 ②软磁盘控制器 ③软磁盘片:3.5英寸和5.25英寸两种 3.5英寸软磁盘:
① 磁道(track):从外向里编号为0 ~ 79,共80道。
②扇区(sector):在每个磁道上划分18个扇区,编号为0 ~ 17,共18个扇区。每个扇区的容量为512K个字节。
③簇(cluster):若干个扇区构成一个簇,它是磁盘存储分配的单位。
④格式化:用户对软盘的初始化操作,其包括磁道数、扇区数的划分以及软盘初始信息的写入。 软盘容量的计算公式: 80 18 512 2=1474560字节=1440K字节≈1.44MB 写保护口:若该口可以透光,则此盘处于写保护状态,即:只能读取信息,不能写入数据。反之,可读可写。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: