1. ホーム
  2. c++

[解決済み】 ios_base::sync_with_stdio(false); cin.tie(NULL) の有意性。)

2022-04-20 11:37:07

質問

を含む意義は何ですか?

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 . この場合、セグメンテーションフォールトが発生しました。この場合、セグメンテーションフォールトが発生します。

解決方法は?

この2つの呼び出しは、パフォーマンスとは無関係の異なる意味を持っています。 実行時間を早める は(あるいは かもしれない は単なる副次的効果に過ぎません。それぞれが何をするのか理解し、最適化のように見えるからといって、やみくもにすべてのプログラムに取り入れるべきではありません。

ios_base::sync_with_stdio(false);

これは、CとC++の標準ストリーム間の同期を無効にします。デフォルトでは、すべての標準ストリームは同期化されており、実際には、CとC++スタイルのI/Oを混在させて、賢明かつ期待通りの結果を得ることができます。同期を無効にすると、C++ストリームはそれ自身の独立したバッファを持つことができるようになり、CとC++スタイルのI/Oを混在させることが冒険になってしまうのです。

また、同期化されたC++ストリームはスレッドセーフであることも覚えておいてください(異なるスレッドからの出力が交錯することがありますが、データレースは発生しません)。

cin.tie(NULL);

これは cin から cout . タイドストリームは、一方のストリームが他方のストリームの各入出力操作の前に自動的にフラッシュされることを保証します。

デフォルトでは cincout を使用することで、ユーザーとの対話が適切に行われるようになります。例えば

std::cout << "Enter name:";
std::cin >> name;

もし cincout が結ばれている場合、プログラムがユーザに入力を促す前に出力がフラッシュされる (すなわち、コンソールに表示される) ことが期待できます。ストリームを解いた場合、プログラムはユーザが名前を入力するのを待ってブロックするかもしれませんが、"Enter name"メッセージはまだ表示されていません(なぜなら cout はデフォルトでバッファリングされており、出力は要求されたとき、またはバッファがいっぱいになったときのみコンソールにフラッシュ/表示されます)。

そのため、もし cin から cout の場合、必ずフラッシュする必要があります。 cout への入力を期待する前に何かを表示したい場合は、毎回手動で行います。 cin .

結論として、それぞれが何をするのかを知り、その結果を理解した上で、本当に必要なのかどうかを判断してください。 可能 速度向上という副次的な効果