Любой поток, который наследуется от std::ostream<Type>
, 'поддерживается' буфером типа std::streambuf<Type>
. Когда вы выводите на ostream
, вы действительно выводите на промежуточный std::streambuf
. Когда streambuf
заполняется данными, он вызывает собственный метод std::streambuf::sync()
, и это сбрасывает данные в поток.
Если бы поток представлял собой устройство символьного типа (консоль, последовательный порт и т. Д.), То sync()
опустошит некоторые или все данные в приемное устройство.
В этом случае принимающее устройство является еще одним буфером. С точки зрения реализации будет иметь смысл, что в этом буфере (char
тип в случае std::strstream
) не будет промежуточной буферизации, поскольку приемный буфер не имеет дополнительной задержки по отношению к streambuf
.
Но - это зависит от реализации. Чтобы убедиться, что приемный буфер на самом деле не ожидает заполнения потокового буфера, было бы целесообразно вызвать flush()
, прежде чем ожидать, что приемный буфер будет завершен перед его использованием.
Реализовать вызов flush()
, это зависит от контекста пользователя. Также следует ожидать, что flush()
понесет снижение производительности при использовании в случае небуферизованной конечной точки (например, консоли, последовательного порта, конечной точки USB и т. Д.).