标题:大家看看我对储存器的理解,希望各位批评指正
只看楼主
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
 问题点数:0 回复次数:3 
大家看看我对储存器的理解,希望各位批评指正
最近师兄面试,经常被问到关于计算机中的储存区的一些习惯概念,感觉自己也不是很清楚,在网上仔细参考一些资料后,结合自己的理解,予以总结如下,希望各位批评指正.

操作系统采用 外存->内存、缓存->寄存器构架方式实现数据的访问处理

外储存器也称辅助存储器,简称外存或辅存。它主要指那些容量比主存大、读取速度较慢、通常用来存放需要永久保存(文件)或相对来说暂时

不用(虚拟内存)的数据。在WINDOWS下,可用VirtualAlloc分配虚拟内存,它不是在堆上,也不在栈上,而是直接在进程的地址空间中保留一快

内存。
内存(缓存)一般存放当前正被频繁访问的数据,当不考虑当前执行程序部分可能被存放在虚拟内存中时,我们就可以认为它被保存在内存(缓存

)中。
寄存器其实是程序执行必不可少的存储器,存在于CPU中。在计算机运行中,除了个别指令,如DMA的操作和mov指令外,一般数据均要经过寄存

器。

对于c/c++程序,变量在内存中的三个地方保存,他们分别是:  
  1、静态储存区(Static Memory),保存全局变量和静态变量。   典型有:字符串、结构体常量、全局变量、共享变量和静态变量(data,bss)
     内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.
  2、自动储存区(AutoMatic Memory),保存函数参数和局部变量。典型有:局部变量(stack)
     栈内存分配运算内置于处理器的指令集中,效率较高,但是分配的内存容量有限,它随子函数调用结束而消失。
  3、自由储存区(Free Memory),程序员自己申请和释放的。       典型有:malloc动态申请空间(heap)
     动态内存的生存期由我们决定,使用较为灵活。

注:(1)常数一般作立即数,存在于代码段(区别const常量,一般在静态储存区的数据段),操作系统不为其分配空间
    (2)由 register 定义的寄存器变量不像其他变量那样在内存中存放数据,而是在CPU的寄存器中暂存数据,使用寄存器变量比使用内存变

量的操作速度快得多。只有整型和字符型变量可定义为寄存器变量。由于CPU中寄存器有限,尽量减少使用数量和和占用时间,用完马上释放;

不能定义为全局变量,也不能定义在结构或者类中。但是实际情况是,register 变量并不真的一定被放置在寄存器中,这和编译器优化有关
    (3)在java里没有了全局变量,静态变量也放进了类模型里面(也就是下面的自动储存区),所以java没有静态储存区。
    (4)代码段(text)是程序执行的实现段,但是它是只读的,显然变量不能在代码段存放(除非是一些只读的常变量,如字符串常量)  
    (5)const只是说明该变量是只读的,和放在哪里没关系,const变量可能是局部也可能是全局的。
    (6)常量段一般只包含编译器产生的数据,它和只读段包含用户定义的只读数据(一般在data段)不同
搜索更多相关主题的帖子: 储存器 构架 程序段 生命期 
2008-11-03 03:59
冰烨
Rank: 1
来 自:不咔界
等 级:新手上路
威 望:1
帖 子:135
专家分:0
注 册:2007-10-30
得分:0 
那我们经常说的字符串常量放在常量区,这个常量区应该怎么理解呢?

要么死去,要么奋斗!
2008-11-03 09:39
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
字符串 位置要分情况讨论吧

char   a[]   =   "abc ";   // 这里的字符串 在静态储存区    data

void main()
{
    char aa[] = "vfdff@ 这里的字符串 在常量区 const
    char *str = "zhong"; // 这里的字符串 在常量区           const
}

[[it] 本帖最后由 vfdff 于 2008-11-5 02:40 编辑 [/it]]

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-11-05 02:24
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
#pragma data_seg(".text")
char *p = "data_seg";      // 这里的字符串在代码段.text
#pragma data_seg()

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-11-05 02:48



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-242086-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.179064 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved