在c ++中刷新字符串流会发生什么?

时间:2018-05-14 01:45:31

标签: c++ io stream

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

1 个答案:

答案 0 :(得分:0)

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

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

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

但是 - 这取决于实现。为了确保接收缓冲区实际上没有等待streambuf填充,在使用它之前调用streambuf在期望接收缓冲区完成之前是明智的。

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