【问题标题】:What happens when a stringstream is flushed in c++?在 C++ 中刷新字符串流时会发生什么?
【发布时间】:2018-10-23 15:11:51
【问题描述】:

我最近了解到std::stringstream 对象可以被刷新。冲洗有什么作用?它是由标准指定的,还是依赖于实现的,flush 在调用时是否必须做任何事情?

【问题讨论】:

  • 我假设它只是继承了flush,但我非常怀疑它有什么作用,因为刷新它没有意义。但我可能是错的,所以我没有回答。
  • 查看您的编译器的 STL 实现源代码,以准确了解刷新的作用或不作用。

标签: c++ io stream


【解决方案1】:

从std::ostream<Type> 继承的任何流都由std::streambuf<Type> 类型的缓冲区“支持”。当您输出到ostream 时,您实际上是在输出到中间std::streambuf。当streambuf 充满数据时,它会调用自己的方法std::streambuf::sync(),这会将数据刷新到流中。

如果流是某种字符类型的设备(控制台、串行端口等),那么sync() 会将部分或全部数据清空到接收设备中。

在这种情况下,接收设备是另一个缓冲区。从实现的角度来看,这个缓冲区(std::strstream 的情况下为 char 类型)不会有中间缓冲,因为接收缓冲区相对于 streambuf 没有额外的延迟,这是有道理的。

但是 - 这取决于实现。为了确保接收缓冲区实际上没有等待流缓冲区填充,在使用接收缓冲区之前调用flush() 是谨慎的做法。

实现对flush() 的调用取决于用户上下文。您还应该期望 flush() 在用于非缓冲端点(如控制台、串行端口、USB 端点等)的情况下会产生性能损失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2012-09-26
    • 2021-05-23
    • 2016-11-11
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多