Форум программистов, компьютерный форум CyberForum.ru

Странное поведение cout после объявления объекта класса - C++

Восстановить пароль Регистрация
 
grayscale
1 / 1 / 1
Регистрация: 12.04.2013
Сообщений: 34
09.11.2013, 01:57     Странное поведение cout после объявления объекта класса #1
C++
1
2
3
4
List words;
string strg;
сin >> strg;
сout << strg;
Ничего не выведет, пока в поток вывода не отправится endl или \n.
Если закомментировать первую строчку, вывод такой, как и положен быть.
C++
1
2
3
4
5
List::List()
{
    m_nCounter = 0;
    pHead = 0;
}
Среда - Qt Creator. У меня уже разрыв шаблона, помогите
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2013, 01:57     Странное поведение cout после объявления объекта класса
Посмотрите здесь:

странное поведение fstream C++
C++ Странное поведение
Странное поведение new C++
Странное рекурсивное поведение объекта std::cout C++
C++ Вывод объекта класса созданного пользователем на консоль объектом cout
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 1
09.11.2013, 02:05     Странное поведение cout после объявления объекта класса #2
а так?
C++
1
( std :: cout << strg ).flush ( ) ;
grayscale
1 / 1 / 1
Регистрация: 12.04.2013
Сообщений: 34
09.11.2013, 02:09  [ТС]     Странное поведение cout после объявления объекта класса #3
Цитата Сообщение от Croessmah Посмотреть сообщение
а так?
а так работает. Но выглядит костыльно.
Да и не в этом дело. Почему так происходит?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 1
09.11.2013, 02:18     Странное поведение cout после объявления объекта класса #4
Цитата Сообщение от grayscale Посмотреть сообщение
Почему так происходит?
Скорее всего из-за буферизации.
grayscale
1 / 1 / 1
Регистрация: 12.04.2013
Сообщений: 34
09.11.2013, 02:23  [ТС]     Странное поведение cout после объявления объекта класса #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Скорее всего из-за буферизации.
а откуда она взялась, эта страшная Буферизация? издержки среды разработки?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
09.11.2013, 02:29     Странное поведение cout после объявления объекта класса #6
Цитата Сообщение от grayscale Посмотреть сообщение
Ничего не выведет, пока в поток вывода не отправится endl
endl выполняет flush после добавления перевода строки в поток.

Добавлено через 3 минуты
Цитата Сообщение от grayscale Посмотреть сообщение
а откуда она взялась, эта страшная Буферизация? издержки среды разработки?
Оптимизация.
grayscale
1 / 1 / 1
Регистрация: 12.04.2013
Сообщений: 34
09.11.2013, 02:31  [ТС]     Странное поведение cout после объявления объекта класса #7
Цитата Сообщение от gray_fox Посмотреть сообщение
Оптимизация.
простите, я не понял, что вы имеете в виду.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 1
09.11.2013, 02:34     Странное поведение cout после объявления объекта класса #8
Цитата Сообщение от grayscale Посмотреть сообщение
простите, я не понял, что вы имеете в виду.
Намного быстрее "вывести" 1 раз 100 символов, чем 100 раз по 1 символу.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
09.11.2013, 02:42     Странное поведение cout после объявления объекта класса #9
grayscale, грубо говоря, дешевле выводить на экран\записывать данные некоторыми порциями, а не по одному символу\байту. Для этого данные сначала накапливаются во временном хранилище (буфер), потом в устройство пишеться сразу весь буфер.

Добавлено через 54 секунды
Если надо, можно принудительно сбросить буфер с помощью flush.
grayscale
1 / 1 / 1
Регистрация: 12.04.2013
Сообщений: 34
09.11.2013, 02:50  [ТС]     Странное поведение cout после объявления объекта класса #10
Цитата Сообщение от gray_fox Посмотреть сообщение
Для этого данные сначала накапливаются во временном хранилище (буфер), потом в устройство пишеться сразу весь буфер.
Но если не создавать объект класса, все работает нормально. И вообще у меня никогда с этим проблем не было.
Дело в потребляемой памяти что ли?
А кто решает, что в данном конкретно случае следует буфферизовать данные? ОС, или это происходит на этапе компиляции?
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
09.11.2013, 03:11     Странное поведение cout после объявления объекта класса #11
Цитата Сообщение от grayscale Посмотреть сообщение
А кто решает, что в данном конкретно случае следует буфферизовать данные? ОС, или это происходит на этапе компиляции?
Зависит от устройства. stderr например (с ним связан std::cerr) не буферизован.

Добавлено через 18 минут
Ну т.е. компиляция тут вообще не причём. Просто для многих устройств реализована буферизация: в стандартной библиотеке, своя в ОС, там много может быть уровней.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2013, 03:24     Странное поведение cout после объявления объекта класса
Еще ссылки по теме:

C++ Друзья, подскажите, говорят, что можно поля класса инициализировать в момент объявления класса. Как это сделать?
Ошибка объявления объекта класса C++
C++ wstring странное поведение после GetEnvironmentVariable

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
grayscale
1 / 1 / 1
Регистрация: 12.04.2013
Сообщений: 34
09.11.2013, 03:24  [ТС]     Странное поведение cout после объявления объекта класса #12
gray_fox, разобрался, спасибо

Добавлено через 5 минут
cpp.com.ru/bogatyrev_c_unix/gl_4_3.html
оставлю это здесь для потомков
Yandex
Объявления
09.11.2013, 03:24     Странное поведение cout после объявления объекта класса
Ответ Создать тему
Опции темы

Текущее время: 18:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru