我最近了解到可以刷新std::stringstream
个对象。冲洗有什么作用?它是由标准指定的,还是依赖于实现的?flush
在调用时是否必须做任何事情?
答案 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()
会产生性能损失。