Значение базы ios:: синхронизация с stdio (false); cin.галстук (NULL);
каково значение включения
ios_base::sync_with_stdio(false);
cin.tie(NULL);
в программах на C++?
в моих тестах это ускоряет время выполнения, но есть ли тестовый случай, о котором я должен беспокоиться, включая это?
всегда ли 2 утверждения должны быть вместе, или достаточно первого, т. е. игнорирование cin.tie(NULL)
?
кроме того, допустимо ли использовать одновременные команды C и c++, если его значение установлено в false
?
https://www.codechef.com/viewsolution/7316085
приведенный выше код работал нормально, пока я не использовал scanf/printf
в программе на C++ со значением как true
. В этом случае он дал ошибку сегментации. Какое может быть объяснение?
3 ответа:
эти два вызова имеют разные значения, которые не имеют ничего общего с производительностью; тот факт, что это ускоряет время выполнения (или может быть) просто побочный эффект. Вы должны понимать, что каждый из них делает, а не слепо включать их в каждую программу, потому что они выглядят как оптимизация.
ios_base::sync_with_stdio(false);
это отключает синхронизацию между стандартными потоками C и C++. По умолчанию синхронизируются все стандартные потоки, что на практике позволяет смешивать C-и C++ - стиль ввода / вывода и получать разумные и ожидаемые результаты. Если вы отключите синхронизацию, то потокам C++ разрешено иметь свои собственные независимые буферы, что делает смешивание ввода - вывода в стиле C и C++приключением.
также имейте в виду, что синхронизированные потоки C++ являются потокобезопасными (вывод из разных потоков может чередоваться, но вы не получаете гонок данных).
cin.tie(NULL);
это развязывает
cin
Сcout
. Связанные потоки обеспечивают этот поток автоматически сбрасывается перед каждой операцией ввода-вывода в другом потоке.по умолчанию
cin
связана сcout
для обеспечения разумного взаимодействия с пользователем. Например:std::cout << "Enter name:"; std::cin >> name;
если
cin
иcout
привязаны, вы можете ожидать, что вывод будет сброшен (т. е. виден на консоли) до того, как программа запросит ввод от пользователя. Если вы отвяжете потоки, программа может заблокировать ожидание ввода пользователем своего имени, но "введите имя" сообщение еще не видно (потому чтоcout
буферизуется по умолчанию, вывод сбрасывается / отображается на консоли только по требованию или когда буфер заполнен).так что если ты развяжешь
cin
Сcout
, вы должны убедиться, чтобы очиститьcout
вручную каждый раз, когда вы хотите, чтобы отобразить что-то прежде, чем ожидать ввода наcin
.в заключение, знать, что каждый из них делает, понять последствия, а затем решить, если вы действительно хотите или нуждаетесь в возможно побочный эффект улучшения скорости.
это для синхронизации IOs из мира C и C++. Если вы синхронизируете, то у вас есть гарантия, что заказы всех IOs именно то, что вы ожидаете. В общем, проблема заключается в буферизации IOs, которая вызывает проблему, синхронизируя пусть оба мира разделяют одни и те же буферы. Например
cout << "Hello"; printf("World"); cout << "Ciao";
; без синхронизации вы никогда не будете знать, если вы получитеHelloCiaoWorld
илиHelloWorldCiao
илиCiaoHelloWorld
...
tie
позволяет вам иметь гарантию того, что каналы IOs в мире C++ являются привязан один к другому, что означает, например, что каждый выход был сброшен до входа происходит (подумайте оcout << "What's your name ?"; cin >> name;
).вы всегда можете смешивать C или c++ IOs, но если вы хотите разумного поведения, вы должны синхронизировать оба мира. Помните, что в целом не рекомендуется смешивать их, если вы программируете на C использовать C stdio, и если вы программируете на C++ использовать потоки. Но вы можете захотеть смешать существующие библиотеки C в код C++, и в таком случае необходимо синхронизации.
используя
ios_base::sync_with_stdio(false);
достаточно, чтобы отвязатьC
иC++
потоки. Вы можете найти обсуждение этого в стандартные C++ IOStreams и Locales, Лангер и Крефт. Они отмечают, что то, как это работает, определяется реализацией.The
cin.tie(NULL)
вызов, кажется, запрашивает развязку между действиями наcin
иcout
. Я не могу объяснить, почему использование этого с другой оптимизацией должно вызвать сбой. Как уже отмечалось, ссылка, которую вы предоставили, плохая, поэтому никаких спекуляций здесь.