大家看看我对储存器的理解,希望各位批评指正
最近师兄面试,经常被问到关于计算机中的储存区的一些习惯概念,感觉自己也不是很清楚,在网上仔细参考一些资料后,结合自己的理解,予以总结如下,希望各位批评指正.操作系统采用 外存->内存、缓存->寄存器构架方式实现数据的访问处理
外储存器也称辅助存储器,简称外存或辅存。它主要指那些容量比主存大、读取速度较慢、通常用来存放需要永久保存(文件)或相对来说暂时
不用(虚拟内存)的数据。在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段)不同