У меня вопросы:
1) то что записывается в этот поток мгновенно отображается на устройстве, которое связано с ним или нет.
Как правило, не мгновенно.
Эффективнее обмениваться с внешним устройством не посимвольно (побайтово), а достаточно большими блоками за один раз. Поэтому для вывода в файл в оперативной памяти резервируется буфер, и по мере его заполнения содержимое буфера целиком сбрасывается на устройство, после чего буфер очищается и заполняется снова.
Если информация выводится в поток небольшими порциями, может пройти существенное время, пока она физически попадет на внешнее устройство. Ускорить этот процесс, принудительно выводя незаполненный буфер, можно следующими средствами:
- при закрытии файла;
- операцией
flush.
2) в доке я прочитал, что endl пишет в поток "\n", и выполняет flush(), который в свою очередь должен вывести содержимое потока на устройство, но оно (содержимое) выведется и без flush(), тогда в чем разница этих двух строк:
std::cout<<"Hello World!\n";
std::cout<<"Hello World!"<<std::endl;
На выходе будет один и тот же "Hello World!", а каретка будет на следующей строке.
Разница лишь в том, что во втором случае выводимая строка будет передана на устройство с максимально возможной скоростью, тогда как в первом это может произойти нескоро.