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

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

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

相关文章

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变