Что происходит, когда поток строк сбрасывается в C ++? - PullRequest
0 голосов
/ 14 мая 2018

Я недавно узнал, что std::stringstream объекты могут быть сброшены. Что делает промывка? Это указано стандартом или зависит от реализации, и flush должен что-то делать при вызове?

1 Ответ

0 голосов
/ 14 мая 2018

Любой поток, который наследуется от std::ostream<Type>, 'поддерживается' буфером типа std::streambuf<Type>. Когда вы выводите на ostream, вы действительно выводите на промежуточный std::streambuf. Когда streambuf заполняется данными, он вызывает собственный метод std::streambuf::sync(), и это сбрасывает данные в поток.

Если бы поток представлял собой устройство символьного типа (консоль, последовательный порт и т. Д.), То sync() опустошит некоторые или все данные в приемное устройство.

В этом случае принимающее устройство является еще одним буфером. С точки зрения реализации будет иметь смысл, что в этом буфере (char тип в случае std::strstream) не будет промежуточной буферизации, поскольку приемный буфер не имеет дополнительной задержки по отношению к streambuf.

Но - это зависит от реализации. Чтобы убедиться, что приемный буфер на самом деле не ожидает заполнения потокового буфера, было бы целесообразно вызвать flush(), прежде чем ожидать, что приемный буфер будет завершен перед его использованием.

Реализовать вызов flush(), это зависит от контекста пользователя. Также следует ожидать, что flush() понесет снижение производительности при использовании в случае небуферизованной конечной точки (например, консоли, последовательного порта, конечной точки USB и т. Д.).

...