【浅谈】计算机存储 寄存器,高速缓存,内存和硬盘 栈区,堆区和静态区

本文主要是介绍【浅谈】计算机存储 寄存器,高速缓存,内存和硬盘 栈区,堆区和静态区,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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放到寄存器中,但运行的时候,系统会自动判定,至于放不放到寄存器中,还要看系统人老人家怎么看啦~~
 

这篇关于【浅谈】计算机存储 寄存器,高速缓存,内存和硬盘 栈区,堆区和静态区的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/402309

相关文章

java变量内存中存储的使用方式

《java变量内存中存储的使用方式》:本文主要介绍java变量内存中存储的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、变量的定义3、 变量的类型4、 变量的作用域5、 内存中的存储方式总结1、介绍在 Java 中,变量是用于存储程序中数据

浅谈Redis Key 命名规范文档

《浅谈RedisKey命名规范文档》本文介绍了Redis键名命名规范,包括命名格式、具体规范、数据类型扩展命名、时间敏感型键名、规范总结以及实际应用示例,感兴趣的可以了解一下... 目录1. 命名格式格式模板:示例:2. 具体规范2.1 小写命名2.2 使用冒号分隔层级2.3 标识符命名3. 数据类型扩展命

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

双系统电脑中把Ubuntu装进外接移动固态硬盘的全过程

《双系统电脑中把Ubuntu装进外接移动固态硬盘的全过程》:本文主要介绍如何在Windows11系统中使用VMware17创建虚拟机,并在虚拟机中安装Ubuntu22.04桌面版或Ubunt... 目录一、首先win11中安装vmware17二、磁盘分区三、保存四、使用虚拟机进行系统安装五、遇见的错误和解决

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.