微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

endl 主要如何影响完全缓冲的流?

如何解决endl 主要如何影响完全缓冲的流?

https://www.cplusplus.com/doc/tutorial/basic_io/

在以下站点中,就在 cin 标题之前,声明

endl 操作符产生一个换行符,与插入 '\n' 完全一样;但它还有一个额外的行为:流的缓冲区(如果有)被刷新,这意味着输出被请求物理写入设备,如果它还没有。 这主要影响完全缓冲的流,而 cout(通常)不是完全缓冲的流。

我的问题是,为什么 endl 主要影响完全缓冲的流,而 cout 不是完全缓冲的流?

解决方法

输出流主要使用三种缓冲策略:

  1. 无缓冲 - 对流的每次写入都会立即写入底层输出设备。
  2. 行缓冲 - 对流的写入存储在内存中,直到写入换行符或缓冲区已满,此时缓冲区将刷新到底层输出设备。
  3. 完整缓冲 - 对流的写入存储在内存中,直到流的内部缓冲区已满,此时缓冲区将刷新到底层输出设备。

为什么 endl 主要影响完全缓冲的流

从上面的描述中,这应该是相当明显的。如果流没有缓冲,那么 std::endl 不会做任何额外的工作;没有要刷新的缓冲区。如果流是行缓冲的,那么无论如何写入换行符都会刷新缓冲区,因此 std::endl 不会做任何额外的事情。只有对于完全缓冲的流,std::endl 才会做任何额外的工作。


为什么 cout 不是完全缓冲的流?

C++ 语言没有指定用于 std::cout 的缓冲策略,但是当程序的标准输出流连接到终端时,大多数实现要么不使用缓冲,要么使用行缓冲。如果 stdout 被重定向到其他东西,比如一个文件,许多实现将切换到对 std::cout 使用完全缓冲的流。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。