c++ 变量存储放位置

转自:http://www.cnblogs.com/yin-jingyu/archive/2012/02/10/2346098.html

http://www.cppblog.com/franksunny/archive/2007/06/01/25277.html

以作总结


 1、首先,讲下 “堆 heap” 和 “栈 stack” 的区别:

    一个由 c/c++编译过的程序占用的内存分为一下几个部分

    (1)、栈区 stack :由编译器自动分配释放,

              存放函数的参数值,局部变量的值等。

              这个栈的操作方式类似于数据结构中的栈。

    (2)、堆区 heap :一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,

              注意它与数据结构中的堆是两回事,分配方式类似于链表。

    (3)、全局区(静态去)static : 全局变量和静态变量的存储是放在一块的。

                    初始化的全局变量和静态变量在一块区域,

                    未初始化的全局变量和静态变量又放在相邻的另一块区域中。

                    程序结束后由系统释放。

    (4)、文字常量区  : 常量字符串放在这里。

               程序结束后由系统释放。

    (5)、程序代码区 : 存放函数体的2进制代码。


  2、例子程序 

    这是一个前辈写的,非常详细 

    //main.cpp 

    int a = 0; 全局初始化区 

    char *p1; 全局未初始化区 

    main() 

    { 

    int b;// 栈 

    char s[] = "abc"; //栈 

    char *p2; //栈 

    char *p3 = "123456"; 123456\0";//在常量区,p3在栈上。 

    static int c =0; //全局(静态)初始化区 

    p1 = (char *)malloc(10); 

    p2 = (char *)malloc(20); 

    //分配得来得10和20字节的区域就在堆区。 

    strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 

    } 

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

关于变量的存储问题

 

以前从事上位机程序代码的编写,压根不用很具体的考虑变量的具体存放位置,只知道以下概念就行了:

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 写保护口:若该口可以透光,则此盘处于写保护状态,即:只能读取信息,不能写入数据。反之,可读可写。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值