美文网首页C语言C++
我理解中的缓存是这样的

我理解中的缓存是这样的

作者: 手撕小黄鸡 | 来源:发表于2019-06-25 09:02 被阅读2次

最近在做了几期C语言知识点解析,其中大多都是理论知识,并没有一些实际操作,所有朋友问为什么不放一些源代码,我就说明一下:网上的C语言教程是非常多的,这些教程中就长附带着源代码,所以我就没有去专门写这些,因为软件的学习并不是说通过代码尽快上手就可以了,学习编程,我们最重要的是理解其中的思维和在编程过程中遇到的一些知识难点,而我做的是将我们往往忽视的这一部分提出来,并告诉大家。就像C语言,我几年前公司免供java培训的时候旁听过几节课,那时也先学C语言,但是它们讲的C语言,是纯粹的以上岗为目的培训,很多重要知识点都没有讲到,一蹴而过。把一个一个程序培养成了编码员,不了解编码员的可以搜一下编码员和程序员的区别。所以我就想写一写编程基础的一些要点,不仅给朋友们看,更多的也是让自己的知识储备加深,对编程更精通。请恕我之言,到现在为止,还有很多朋友是不知道内存分配和堆栈的关系。

案例:上期因为中文编码问题,我们说了编码分为源代码编码格式和运行编码两种情况,所以因为电脑系统的原因,默认编码格式并不一样导致中文编码乱码问题。今天我们又从最基本的地方引出另一个问题,那就是缓冲,我们先运行一个代码块来看,有条件的可以自己试试。

#include

int main()

{

int a =1, b=1;

char str[10];

printf("请依次输入a b c 三个值");

scanf("%d", &a); //在输入过程中 a输入 整数

scanf("%d", &b); //在输入过程中 b输入 字符串

scanf("%s", str); //在输入过程中 c输入 字符串

printf("匹配值 a=%d, b=%d, str=%s ", a, b, str);

return 0;

}

我们这样输入: ”3 beautiful success“。第一个输入整数,第二个输入字符串,第三个输入字符串。

请看这结果

运行结果:虽然我们在编译后按照提示输入值,但是我们并没有严格按照要求输入两个整数和一个字符串,而是输入了一个整数和两个字符串,一般来说,遇到这种情况,程序应该会抛出异常和错误才是,但是这里并没有,仍然可以正常输出,只不过输出的内容出现了问题。a值变成了我们输入的3,b值没有变化,c值却成了我们输入的第二个值。下面我们就简单分析下。

分析:我们要知道,当通过scanf函数输入数据时,并不是直接输入的值放进对应标识符代表的空间中的,而是在输入的时候会等待全部完成后的那个回车键后进行检查,在这之前,所输入的信息都会放在一个叫缓存的地方,然后程序才会进行匹配。

当匹配a的时候,发现缓存中第一个输入的a是个整型,那好,类型是对的,顺序也是对的,于是就将3赋值给了a,当匹配b数据的时候,咦?,类型怎么不对呢,于是程序就认为输入第二个数据是整型,但是现在第二个没有整型,是不是没有输入,于是就默认第二个数据没有输入,所以b的值就没有变。当匹配第三个数据的时候,就会把我们第二输入的值(程序会认为这是第三个值)和第三数据进行对比,如果数据类型一直,那么就会将数据赋值给c。这下明白了吧。

可能有的朋友会问,假如我输入一个敲一下空格,会发什么,那么我告诉你,当输入第二个数据为字符串的类型,它会立马将之匹配给第三个值,显示并输出,也就是说第三都不用输入了。

缓存:

通过上面的分析发现吗,造成这一切原因的罪魁祸首就是上面说的缓存了,缓存我们经常听,做web的有浏览器缓存,做app的有缓存,那么它到底是什么,我就来说我的看法。

缓存我们一般也成缓冲区,从另一面来说,实际上缓存也算内存管理的一部分,只不过这部分内存空间只能暂时保存数据,那么为什么要用是它,我们举个例子来说:

我们现在只有一个水龙头,但是有好几个桶,我们要给这几个桶加满水,配上药。但是我们用水龙头给桶里添水的时候,我们还要添加药物混合,这时候,我们就要关了水,然后放点药,然后再加水,再放药。是不是填满一桶水的要浪费很多时间,并且其他桶也接不上水。这时候怎么办呢,我们就想了一个办法,先算好药的数量放进桶里,然后再加水,这样就不回来开关水龙头,同时,在添水的时候,我们仍然可以给其他桶里加药。这样是不是就快了很多。

缓存就是这个道理,我们的计算机不可能只运行我们这一个程序,它有很多程序在同时运行,所以当我们运行自己编写的代码时,计算机就给我们发了一个桶,然后等我们把所有的数据填进去后,它才会对这些数据进行处理,储存在我们的硬盘中。然后看看,是不是这个理。

当然,这只是使用缓存的原因之一,还有另一个原因就是我们说的软硬件交互的问题。我们都知道,人有反应这么一说,很多时候,脑袋想明白了,但是用其他人体器官的时候会慢一拍。我们把人脑比作CPU,器官比作硬件,是不是CPU和其他硬件就有了反应过程。比如硬盘,固态硬盘和机械硬盘,就是因为和CPU交互速度不同,导致价格差别也非常大。所以为了不浪费这些时间,就有了缓存这个概念,我们运行起程序后,计算机给我们分配一块缓存,我们硬件上的交互,输入等都存在缓存中,当认为程序可以继续执行时,CPU才会去处理缓存中的这些数据。

我们的缓存区一般分为好几种,我从我们常用的几个软件来说,大家很容易就理解了。

全缓存:Txt文档大家都用过吧,当我们在里面输入了好多内容后发现,如果直接关闭,再次打开的时候,就会什么都没有,office也一样,如果提示我们保存的时候我们不保存,那么就不会更新内容。原因就是我们在文档中写的东西并没有真正储存在硬盘中,而是储存在缓存中,当点击保存后,就会全部取出来保存在硬盘中。

行缓存:我们上面写的代码就是行缓冲,在Linux下每次运行的时候,就会将缓存中的数据读取一次。(Windows下是不带缓存)注意:这里的不带缓存是printf不带缓存,而scanf是带缓存的。

不带缓存:我们现在用的很多网络编辑器,比如头条号的发文编辑器,它就有不带缓存的原理,我们每次输入的时候,它会立马保存信息。(是原理,具体情况他们技术应该知道)。

最后有一点要注意的是缓存是大小的,当缓存满后,就会自动刷新缓冲区。

相关文章

  • 我理解中的缓存是这样的

    最近在做了几期C语言知识点解析,其中大多都是理论知识,并没有一些实际操作,所有朋友问为什么不放一些源代码,我就说明...

  • Spring-cache-shiro

    Shiro缓存机制(代码) 缓存简介 缓存,我的理解是:让数据更接近于使用者;工作机制是:先从缓存中读取数据,如果...

  • springboot - 配置 cache 缓存处理

    缓存简介 缓存,我的理解是:让数据更接近于使用者;工作机制是:先从缓存中读取数据,如果没有再从慢速设备上读取实际数...

  • Okhttp缓存源码分析和自定义缓存实现

    缓存的一般思路 下面是我理解的网络请求框架的缓存基本实现。大致的过程是有缓存用缓存的数据,没缓存发起http请求取...

  • Redis原理&设计

    缓存原理&设计 本章学习目标 理解缓存的使用场景(重点) 理解缓存原理(重点) 了解常见缓存以及分类(重点) 理解...

  • 自信,我是这样理解的

    一个人的自信,应该是来源多方面的。我先从我个人经历说起。 一、来源于父母 从小,父母就和我说:“我们家,你和弟弟都...

  • 我是这样理解成功的!

    一.什么是成功 很多时候我是一个标题党,在看到这本书的名字的时候,成功,这两个字吸引了我。是的,我想要成功,在我没...

  • 我是这样理解《见识》的

    2019.1.5,日更第二十七天,今天最高气温3℃,最低气温—4℃,天气阴,空气质量良好。 《见识》 作者:吴军 ...

  • 我是这样理解爱的

    我都会爱,但无法很清晰的说出爱是什么? 我觉得爱对我来说首先是自由的,当爱来临的时候,我不是被对方束缚的,我也不会...

  • 我是这样理解股票的

    「今天是木子读吧陪你的第850天」 提起财富,人们首先想到的肯定是货币、金钱。无论是古代的贝壳、铜钱,近代的金币、...

网友评论

    本文标题:我理解中的缓存是这样的

    本文链接:https://www.haomeiwen.com/subject/slmzqctx.html