本文主要是介绍【浅谈】计算机存储 寄存器,高速缓存,内存和硬盘 栈区,堆区和静态区,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
https://blog.csdn.net/m0_66300397/article/details/130020405
计算机上的存储
数据在计算机中,存储在硬盘,内存,高速缓存和寄存器上。
四者根据速度和存储量,有如下表示:
寄存器上,一般都是字节大小的存储空间;高速缓存器上的存储空间要相对大一点,可以达到MB,但是也只是很小的存储空间。
电脑大部分的数据都存储在内存上,一般电脑的内存都是4G,8G,16G的,目前市场上电脑支持的最大运行内存是128G。
硬盘是用来做内存扩充的,像我们平常下载的游戏,缓存的资源,都是放在硬盘上,所以硬盘上的空间要明显更大一点,但是想要使用硬盘上的数据时,要将硬盘数据拿到内存中。
内存
像我们编程中所产生的数据,都是存储在内存中,而内存上,也分为多个区域,像内存分配就分为三种:栈区,堆区,静态区。
栈区,是用来存放局部变量和函数的形式参数等数据,函数执行结束时,这些存储单元自动被释放,栈区内存分配运算效率很高,但是内存有限。
堆区是用来进行动态内存开辟的,一般由程序员分配释放,若程序员不释放,程序结束时会被OS回收。
静态区是存放全局变量,被static关键字修饰后的静态变量,常量等数据,是在程序结束后由系统进行释放。静态区的数据是可以修改的,只是生命周期较长。
所以说,变量放在哪里,取决于该变量的性质,局部变量是放在栈区的,全局变量和被static修饰的静态变量则是放在静态区。
说起static关键字,下面我们再来介绍几个编程中相关的关键字。
关键字
static关键字
普通的局部变量是放在内存的栈区上的,进入局部范围,变量创建,出了局部范围变量销毁。
当static修饰局部变量的时候,局部变量是在静态区开辟空间的,这时的局部变量,出了作用域变量不销毁,下次进入作用域,使用的是上一次遗留的数据。
例如我们想要写一串数字:3 4 5 6 7 8 9 10
我们给出如下代码:
void test()
{
int a = 3;
a++;
printf("%d\n", a);
}
int main()
{
int i = 0;
while (i < 7)
{
test();
i++;
}
return 0;
}
上面这串代码,对于变量a,可以看出,它是局部变量。那么根据局部变量的性质,可以知道该变量,出作用域就会销毁,即运行结果为:
虽然test运行了七次,但是每次进入后,a加1,同时出作用域,a的数据销毁,再次进入,a的初始数据,还是3。
3+1,仍为4,并不能满足我们的需求,这个时候,让我们用static关键字来修饰a呢?
void test()
{
static int a = 3; //这里用static修饰了a
a++;
printf("%d\n", a);
}
int main()
{
int i = 0;
while (i < 7)
{
test();
i++;
}
return 0;
}
运行结果:
显然,这次是符合我们的需求的。
因为被static修饰后的a,是常变量,放在静态区,尽管在运行过程中,出了test的作用域也没有立即销毁, 在一次次进入test的过程中,使数据达到了累加的效果。
register关键字
int a = 0;
register int b = 1;
像用普通int定义的a和b都是变量,无论是全局变量还是局部变量,都是要放在内存中的,用“register”修饰后的b,可以建议将b的数据1放到寄存器中,但运行的时候,系统会自动判定,至于放不放到寄存器中,还要看系统人老人家怎么看啦~~
这篇关于【浅谈】计算机存储 寄存器,高速缓存,内存和硬盘 栈区,堆区和静态区的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!