2009-10-20 1 views
2

Я пытаюсь добавить iostream в устаревший код и, следовательно, хочу синхронизировать эти две библиотеки. В соответствии с этим article, я должен использовать std :: ios_base :: sync_with_stdio.syncing iostream with stdio

Теперь, интересно, как это используется на практике (примеры пожалуйста), побочные эффекты, о которых я должен знать.

Thx

ответ

7

По умолчанию синхронизируются потоки, это гарантированно работать по стандарту, вы не должны ничего делать. sync_with_stdio только здесь, чтобы отключить синхронизацию, если хотите.

Из статьи вы упомянули:

Для предопределенных потоков, это безопасно смешивать STDIO и iostreams. Например, можно использовать stdin и cin в той же программе; C++ Стандарт гарантирует, что он будет работать так, как наивно ожидать его .

Единственный недостаток - потенциальный удар производительности (я думаю, именно поэтому его можно отключить).

+1

Я помню, что сделал некоторый тест, и по умолчанию 'cout' был медленнее, чем' printf', пока я не отключил 'std :: ios_base :: sync_with_stdio', когда' cout' стал быстрее. К сожалению, у меня нет номеров ... – lvella

+0

производительность может быть 10x, в соответствии с banchmarks здесь: [Почему строки чтения из stdin намного медленнее на C++, чем Python?] (Https://stackoverflow.com/questions/ 9371238/почему-это-чтение линий-из-STDIN-гораздо медленнее-в-с-чем-Python? RQ = 1) –

3

Как сказано в TheSamFrom1984, синхронизируется по умолчанию, поэтому это не должно быть проблемой. Однако синхронизация имеет смысл только тогда, когда одни и те же потоки используются обеими библиотеками. Обычно это происходит при использовании cin/cout/cerr и stdin/stdout/stderr соответственно. Однако я вижу несколько причин, по которым нужно использовать оба одновременно, за исключением повторного использования устаревшего кода.

Когда я впервые начал использовать C++, я обнаружил, что делаю это, потому что часто я знал, как делать что-то с помощью stdio, но не знал, как это сделать с помощью iostream, но лучший подход - это выяснить, как это сделать в том или ином, но не в обоих.