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

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

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

相关文章

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. 全局变

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

浅谈MySQL的容量规划

《浅谈MySQL的容量规划》进行MySQL的容量规划是确保数据库能够在当前和未来的负载下顺利运行的重要步骤,容量规划包括评估当前资源使用情况、预测未来增长、调整配置和硬件资源等,感兴趣的可以了解一下... 目录一、评估当前资源使用情况1.1 磁盘空间使用1.2 内存使用1.3 CPU使用1.4 网络带宽二、

通过配置nginx访问服务器静态资源的过程

《通过配置nginx访问服务器静态资源的过程》文章介绍了图片存储路径设置、Nginx服务器配置及通过http://192.168.206.170:8007/a.png访问图片的方法,涵盖图片管理与服务... 目录1.图片存储路径2.nginx配置3.访问图片方式总结1.图片存储路径2.nginx配置

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件