Блог пользователя artemohanjanyan

Автор artemohanjanyan, 11 лет назад, По-русски
#include <iostream>                                                             

using namespace std;

int main()
{
   cout << 1;
   while (true);
   return 0;
}

Есть такой код. По идее он должен вывести 1 и зависнуть, но он просто зависает, единица не выводится. Перевод строки, cout.flush() и много чего еще решают эту проблему, но всё же интересно, почему так происходит. printf точно так же ничего не выводит.

Проблема возникла во время последнего контеста. Я долго висел над B, C прочел за 20 минут до конца и начал лихорадочно кодить. Программа зависала, и я добавил вывод отладочной информации. До конца раунда думал, что програма виснет при считывании последнего элемента массива.

  • Проголосовать: нравится
  • +3
  • Проголосовать: не нравится

»
11 лет назад, # |
  Проголосовать: нравится +1 Проголосовать: не нравится

Потому, что вывод буферизован. Соответственно, реальный вывод происходит тогда, когда заканчивается буфер, либо когда дается команда flush (в частности, это делает endl)

  • »
    »
    11 лет назад, # ^ |
    Rev. 4   Проголосовать: нравится 0 Проголосовать: не нравится

    А что из этого происходит при использовании printf? И когда заканчивается буфер? Немного непонятно, как это делает сишный printf. В C++ это, наверное, происходит при разрушении объекта.

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится

      Когда в нем заканчивается место. Я не знаю, честно говоря, дефолтный размер. В деструкторе флаш происходит, естественно

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Можешь сделать так: setbuf(stdout, NULL);, тогда буферизовать не должно, но думаю при объемном выводе могут возникнуть проблемы со скоростью выполнения.

»
11 лет назад, # |
  Проголосовать: нравится +7 Проголосовать: не нравится

Для debug-вывода лучше использовать небуферизированный cerr.

  • »
    »
    11 лет назад, # ^ |
      Проголосовать: нравится -36 Проголосовать: не нравится

    Он такой же буферизованный, как и другие стандартные потоки вывода.

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится +11 Проголосовать: не нравится

      Конечно же, нет — cerr небуферизованный. Стандарт C++03, параграф 27.3.1.5:

      After the object cerr is initialized, cerr.flags() & unitbuf is nonzero.

      Таблица 83 « fmtflags effects»:

       unitbuf        flushes output after each output operation 
      • »
        »
        »
        »
        11 лет назад, # ^ |
          Проголосовать: нравится +15 Проголосовать: не нравится

        Однако... век живи — век учись, прошу прощения.

    • »
      »
      »
      11 лет назад, # ^ |
        Проголосовать: нравится +11 Проголосовать: не нравится

      Кажется, что ты всё-таки не прав.