Когда cout сбрасывает?

Я знаю, что endl или вызов flush() сбросит его. Я также знаю, что когда вы вызываете cin после cout, он тоже сбрасывается. А также при выходе из программы. Есть ли другие ситуации, когда cout сбрасывает?

Я только что написал простой цикл и не сбрасывал его, но я вижу, как он выводится на экран. Почему? Спасибо!

for (int i =0; i<399999; i++) {

        cout<<i<<"\n";

}

Кроме того, время его завершения такое же, как и с endl, примерно 7 секунд.

for (int i =0; i<399999; i++) {

        cout<<i<<endl;

}

person Arch1tect    schedule 12.03.2014    source источник
comment
Это деталь реализации, которая неизменно зависит от того, перенаправляется ли вывод. Если это не так, то промывка выполняется автоматически по очевидной причине: вы ожидаете сразу же увидеть то, что вычисляете. Большинство ЭЛТ имеют вспомогательную функцию isatty(), которая используется для определения необходимости автоматической очистки.   -  person Hans Passant    schedule 12.03.2014


Ответы (1)


В стандарте нет строгого правила - только то, что endl БУДЕТ сбрасываться, но реализация может сбрасывать в любое время, когда ей «нравится».

И, конечно же, сумма всех цифр менее 400 КБ составляет 6 * 400 КБ = 2,4 МБ, и это очень маловероятно, чтобы поместиться в буфер, и цикл выполняется достаточно быстро, чтобы вы не заметили, если между каждый выход. Попробуйте что-то вроде этого:

 for(int i = 0; i < 100; i++)
 {
   cout<<i<<"\n";
   Sleep(1000);
 }

(Если вы используете ОС на основе Unix, используйте вместо этого sleep(1) или добавьте цикл, который занимает некоторое время и т. д.)

Изменить: следует отметить, что это не гарантирует никакой разницы. Я знаю, что на моей машине с Linux, если у вас нет сброса в этом конкретном типе сценария, он ничего не выводит, однако некоторые системы могут выполнять «сброс на \n» или что-то подобное.

person Mats Petersson    schedule 12.03.2014
comment
Как насчет времени, которое я измерил? Разве тот, у которого нет endl, не должен быть быстрее, хотя иногда он сбрасывается, он должен сбрасываться реже, верно? Я попробовал ваш код, это здорово. Спасибо! - person Arch1tect; 12.03.2014
comment
Скорее всего, оно превысит время, необходимое для вывода на экран. Если вы отправите вывод в NUL: или что-то в этом роде, вы вполне можете увидеть небольшую разницу (но 400 тысяч номеров, вероятно, для этого недостаточно - попробуйте несколько миллионов). - person Mats Petersson; 12.03.2014
comment
обогнал = доминировал. - person Mats Petersson; 12.03.2014