C/C++缓冲区

这篇具有很好参考价值的文章主要介绍了C/C++缓冲区。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是缓冲区?
程序和磁盘文件之间不能直接交换数据,必须通过内存中一个被称为文件缓冲区的区域来中转。ANSIC标准规定,系统会自动为每个正在使用的文件在内存中开辟一个缓冲区,缓冲区的大小随机器而异。

缓冲区有什么作用?
假设我们在家中休息看电视吃零食,每产生一个垃圾我们就下楼丢到楼下的垃圾桶中再上楼回家。这样连续丢多个垃圾,我们就需要连续多次下楼丢垃圾再上楼回家,这样显然效率低下,如果我们把垃圾丢到家中的垃圾桶,当垃圾桶满了,我们在一次性丢到楼下的垃圾桶中,这样效率明显就提高很多,此时,家中的垃圾桶就相当于一个缓冲区,用于提高我们丢垃圾的效率。

因此计算机缓冲区的作用其实就是提升计算机的性能,提高效率,主要体现在以下几个方面:

缓冲区可以减少系统调用的次数:

操作系统提供给程序员的接口就是系统调用。进程在系统上的运行分为2个级别:

用户态(user mode):用户态运行的进程可以直接读取用户程序的数据;

系统态(kernel mode):系统态运行的程序可以访问计算机的任何资源,不受限制

平常我们的进程几乎都是用户态,读取用户数据,当涉及到系统级别资源的操作(例如文件管理、进程控制、内存管理等)的时候,就要用到系统调用了,这时候需要从用户态切换到系统态。

以printf函数为例:调用printf函数是系统级别的操作,属于系统调用,而每进行一次系统调用,就要从用户态切换到内核态再将结果回到用户态,那如果我们连续输出多个字符,就需要连续多次进行系统调用,就需要在用户态和内核态之间不断地来回切换,这样造成系统的开销非常大,这时候缓冲区的作用就体现出来了,要输出的字符在输出缓冲区中先缓存起来,当达到输出的条件时,再进行系统调用一次性将输出缓冲区中的数据输出到标准输出,由于只进行了一次系统调用,比连续多次进行系统调用在性能上提高不少。

缓冲区可以减少对磁盘的读取次数:

当程序要向外存写文件时,数据先被送到内存的文件缓冲区,待缓冲区装满后再一并输出到磁盘文件中;当程序要从外存读入文件时,系统先将一批数据从外存磁盘中一次读入到缓冲区,将缓冲区充满,再根据输入语句的情况将缓冲区中数据依次送到程序的数据区。这种做法的目的是减少访问磁盘的次数,提高程序的运行速度。

缓冲区可以解放CPU:

我们使用打印机打印文档,由于打印机的打印速度(输出)相对较慢,我们先把文档输入到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的CPU可以处理别的事情。

缓冲区的分类:

全缓冲:在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。

行缓冲:在这种情况下,当缓冲区中遇到换行符时,执行真正的I/O操作,典型代表是输入缓冲区和输出缓冲区。

不带缓冲:也就是不进行缓冲,目的是使出错信息可以直接尽快地显示出来。标准出错情况stderr是典型代表。

输入缓冲区:
输入缓冲区通常是一种行缓冲区,程序并不会立即获取键盘输入的数据,键盘输入的数据都会存储在输入缓冲区中,按下回车键后,输入缓冲区遇到回车符,程序才从输入缓冲区读取数据(回车符也会存储在输入缓冲区中)。

输出缓冲区:
输出缓冲区通常也是一种行缓冲区,当有多个连续输出时,为了减少系统调用,程序不会立即把数据输出到屏幕上,而是先存储在输出缓冲区中,当遇到换行符,会输出缓冲区中的数据到外部设备上。

缓冲区的刷新:
以下四种情况会引发缓冲区刷新:

缓冲区满时;
执行 fflush 语句;(fflush 在高版本的VS上不能使用了)
执行 endl 语句;
fclose关闭文件文章来源地址https://www.toymoban.com/news/detail-608996.html

到了这里,关于C/C++缓冲区的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux之缓冲区的理解

    目录 一、问题引入 二、缓冲区 1、什么是缓冲区 2、刷新策略 3、缓冲区由谁提供 4、重看问题 三、缓冲区的简单实现 我们先来看看下面的代码:我们使用了C语言接口和系统调用接口来进行文件操作。在代码的最后,我们还使用fork函数创建了一个子进程。  代码运行结果如

    2024年02月03日
    浏览(50)
  • 【Linux】深入理解文件缓冲区

    问题引入 首先看一段代码: 运行代码,结果如下: 如果此时将输出结果重定向一下: 会发现 printf 、 fwrite 都打印了两次。 究其原因,就要谈到缓冲区和缓冲区刷新策略的概念了。 如何理解缓冲区 假设你在青岛,你要从网上买一件商品,商家所在地是北京。你不会跑去北

    2024年02月11日
    浏览(57)
  • 浅谈linux缓冲区的认识!

    今天来为大家分享一波关于缓冲区的知识!那么既然我们要谈缓冲区,那么就得从是什么?为什么?有什么作用这几个方面来谈论一下缓冲区!然后再通过一些代码来更加深刻的理解缓冲区的知识! 从最简单的理解方面来,我们可以将缓冲区理解成一块内存!那么这块内存是

    2024年02月05日
    浏览(55)
  • [Linux打怪升级之路]-缓冲区

    前言 作者 : 小蜗牛向前冲 名言 : 我可以接受失败,但我不能接受放弃    如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正  本期学习目标:认识什么是缓冲区,缓冲区在哪里,模拟实现一个简单的缓

    2024年02月07日
    浏览(49)
  • 【Linux】基础IO----理解缓冲区

    作者:დ旧言~ 座右铭:松树千年终是朽,槿花一日自为荣。 目标:理解缓冲区 毒鸡汤:有些事情,总是不明白,所以我不会坚持。早安! 专栏选自:Linux初阶 望小伙伴们点赞👍收藏✨加关注哟💕💕 缓冲区大家其实不陌生,像我们使用的 VS2019 编译器这里就有缓冲区,那它

    2024年04月13日
    浏览(47)
  • 【Linux】缓冲区+磁盘+动静态库

    缓冲区的本质就是一段用作缓存的 内存 。 节省进程进行数据IO的时间。进程使用fwrite等函数把数据拷贝到缓冲区或者外设中。 3.1、 立即刷新(无缓冲)——ffush() 情况很少,比如调用printf后,手动调用fflush刷新缓冲区。 3.2、 行刷新(行缓冲)——显示器 显示器需要满足人

    2024年02月05日
    浏览(42)
  • 【Linux】基础IO —— 缓冲区深度剖析

    (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是 Scort 目前状态:大三非科班啃C++中 🌍博客主页:张小姐的猫~江湖背景 快上车🚘,握好方向盘跟我有一起打天下嘞! 送给自己的一句鸡汤🤔: 🔥真正的大师永远怀着一颗学徒的心 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏 🎉🎉

    2024年02月02日
    浏览(55)
  • 【Linux】模拟实现FILE以及认识缓冲区

    刷新缓冲逻辑图 自定义实现 如何强制刷新内核缓冲区 根据文件描述符进行强制刷新 例子 像我们进行scanf输入的时候,其实本身我们输入的是一串字符串,将这个字符串读入对应的缓冲区buff后,然后通过分解工作,进一步传入系统,系统,系统在通过一些指令输入输出想要

    2024年02月10日
    浏览(44)
  • 用Linux的视角来理解缓冲区概念

    缓冲区(buffer)是存储数据的临时存储区域。当我们用C语言向文件中写入数据时,数据并不会直接的写到文件中,中途还经过了缓冲区,而我们需要对缓冲区的数据进行刷新,那么数据才算写到文件当中。而缓冲区通常是一块内存区域,可以是数组、队列、链表等数据结构。

    2024年01月20日
    浏览(55)
  • (9)Linux Git的介绍以及缓冲区

    💭 前言 本章我们先对缓冲区的概念进行一个详细的探究,之后会带着大家一步步去编写一个简陋的 \\\"进度条\\\" 小程序。最后我们来介绍一下 Git,着重讲解一下 Git 三板斧,一般只要掌握三板斧就基本够用了。 先说一下 unistd.h 库中的 sleep 函数,它可以按照秒去休眠 我们先创

    2024年02月03日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包