Значение базы 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 62

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. Я не могу объяснить, почему использование этого с другой оптимизацией должно вызвать сбой. Как уже отмечалось, ссылка, которую вы предоставили, плохая, поэтому никаких спекуляций здесь.