| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1012 人关注过本帖
标题:大家看看我对储存器的理解,希望各位批评指正
取消只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
 问题点数:0 回复次数:2 
大家看看我对储存器的理解,希望各位批评指正
最近师兄面试,经常被问到关于计算机中的储存区的一些习惯概念,感觉自己也不是很清楚,在网上仔细参考一些资料后,结合自己的理解,予以总结如下,希望各位批评指正.

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

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

不用(虚拟内存)的数据。在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
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
快速回复:大家看看我对储存器的理解,希望各位批评指正
数据加载中...
 
   



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

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