C++ primer 查漏补缺 一

第一章

endl 被称为操作符。写入endl的效果是结束当前行,并将与设备关联的缓冲区(buffer)中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中,而不是仅仅停留在内存等待写入流

问题
什么是关联的缓冲区(buffer)

缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。

计算系统的I/O通常非常复杂,由多个抽象层组成。每个这样的层可能会引入一定量的开销。数据缓冲是一种通过最小化系统两层之间执行的单个事务的数量来减少这种开销的方法

  1. CPU/内存系统级缓冲(缓存):对于非常高的活动,即使是计算机的随机访问内存系统也可能成为瓶颈。为了解决这个问题,CPU通过提供多层隐藏缓存(其中的单个缓存称为缓存线)虚拟化内存访问。这些处理器缓存缓冲算法的内存写入(根据a),以最小化内存总线上的冗余访问

  2. 应用程序级缓冲:虽然并非总是必需的,但应用程序在将输出数据传递到I/O库之前分配内存块以积累输出数据的情况并不少见。这提供了允许随机访问(如有必要)的基本好处,但这样做的一个重要原因是它最大限度地减少了与进行库调用相关的开销——这可能比简单地写入内存阵列要耗费更多的时间

  3. I/O库缓冲:可选地为每个打开的流管理一个缓冲区。这个缓冲区特别用于限制操作系统内核的调用数量,因为这样的调用往往会有一些非平凡的开销。这是使用std::endl时刷新的缓冲区

  4. 操作系统内核和设备驱动程序:操作系统根据流连接到的输出设备将数据路由到特定的设备驱动程序(或子系统)。在这一点上,根据该类型设备的性质和特征,实际行为可能会有很大差异。例如,当设备是硬盘时,设备驱动程序可能不会启动到设备的即时传输,而是维护自己的缓冲区,以进一步减少冗余操作(因为磁盘也是以块的形式写入的效率最高)。为了显式地刷新内核级缓冲区,可能需要调用系统级函数,例如——即使是关联的流,也不一定强制这样的刷新
    示例输出设备可能包括
    本地机器上的终端
    远程机器上的终端(通过SSH或类似方式)
    正在通过发送到另一个应用程序的数据
    大容量存储设备和相关文件系统的许多变体,可以(再次)通过网络本地连接或分发

  5. 硬件缓冲区:特定硬件可能包含自己的内存缓冲区。硬盘驱动器,

C++ endl和刷新缓冲区

缓冲区的作用

缓冲区的作用

  1. 在计算机里应用程序调用一个系统调用从用户态进去内核态再将结果回到用户态开销较大。如果我们调用printf函数,每次输出一个字符都要从用户态切换到内核态,那么连续输出多个字符开销成本将会非常大,这个时候缓存就起到非常大的作用了,输出的字符串先在应用程序里缓存起来,缓存到一定数量后再调用系统调用一次性将缓存数据输出到标准输出。由于只调用了一次系统调用,比连续调用多个系统调用性能高上不少。在生活中我们也能感受到缓存带来的效率提升,打个比方你办公室有一个垃圾桶,楼下有倒垃圾的地点,如果扔一个垃圾到垃圾桶里我们就拿去倒掉,将会在办公室和楼下之间来回很多趟,浪费大量时间。如果将垃圾桶装满,再一次性拿到楼下倒掉,只需要跑一次就能把垃圾全都倒掉,节省了时间,提高了效率。

  2. 可以解除两者的制约关系,数据可以直接送往缓冲区,高速设备不用再等待低速设备,提高了计算机的效率。例如:我们使用打印机打印文档,由于打印机的打印速度相对较慢,我们先把文档输出到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的CPU可以处理别的事情。

  3. 可以减少数据的读写次数,如果每次数据只传输一点数据,就需要传送很多次,这样会浪费很多时间,因为开始读写与终止读写所需要的时间很长,如果将数据送往缓冲区,待缓冲区满后再进行传送会大大减少读写次数,这样就可以节省很多时间。例如:我们想将数据写入到磁盘中,不是立马将数据写到磁盘中,而是先输入缓冲区中,当缓冲区满了以后,再将数据写入到磁盘中,这样就可以减少磁盘的读写次数,不然磁盘很容易坏掉。

缓冲区示例:
文件操作演示全缓冲

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值