レガシー コードに iostream を追加しようとしているため、これら 2 つのライブラリを同期したいと考えています。この記事によると、std::ios_base::sync_with_stdio を使用する必要があります。
さて、実際にどのように使用されているのだろうか(例をお願いします)、注意すべき副作用があります。
どうも
デフォルトでは、ストリームは同期され、標準で動作することが保証されているため、何もする必要はありません。sync_with_stdio
必要に応じて同期を無効にするためだけにここにあります。
あなたが言及した記事から:
事前定義されたストリームについては、stdio と iostream を混在させても安全です。たとえば、同じプログラムで stdin と cin を安全に使用できます。C++ 標準は、単純に期待したとおりに機能することを保証します。
唯一の欠点は、パフォーマンスが低下する可能性があることです (それが無効にできる理由だと思います)。
TheSamFrom1984 が言うように、synced がデフォルトであるため、問題にはなりません。ただし、同期は、同じストリームが両方のライブラリで操作されている場合にのみ関連します。これは通常、cin/cout/cerr および stdin/stdout/stderr をそれぞれ使用する場合に発生します。ただし、レガシー コードを再利用する場合を除いて、両方を同時に使用する必要がある理由はほとんどないと思います。
私が最初に C++ を使い始めたとき、stdio を使用して何かを行う方法は知っていたが、iostream を使用してそれを行う方法を知らなかったことが多かったため、これを行っていることに気付きました。両方ではありません。
これは の宣言ですstd::ios_base::sync_with_stdio()
:
static bool sync_with_stdio( bool sync = true );
各入出力操作の後に、標準 C++ ストリームを標準 C ストリームに同期するかどうかを設定します。
標準C ++ストリームは、、、、、、、およびstd::cin
です。std::cout
std::cerr
std::clog
std::wcin
std::wcout
std::wcerr
std::wclog
標準 C ストリームは、stdin
、stdout
、およびstderr
です。
実際には、これは、同期された C++ ストリームがバッファリングされず、C++ ストリームの各 I/O 操作が対応する C ストリームのバッファにすぐに適用されることを意味します。これにより、C++ と CI/O を自由に混在させることができます。
また、同期された C++ ストリームはスレッドセーフであることが保証されています (複数のスレッドから出力される個々の文字はインターリーブする可能性がありますが、データ競合は発生しません)。
同期がオフになっている場合、C++ 標準ストリームは I/O を個別にバッファリングできるため、場合によってはかなり高速になる可能性があります。
デフォルトでは、8 つの標準 C++ ストリームすべてがそれぞれの C ストリームと同期されます。
標準ストリームで I/O が発生した後にこの関数が呼び出される場合、動作は実装定義です。実装は、影響がないものから読み取りバッファを破棄するものまでさまざまです。
例:
#include <iostream>
#include <cstdio>
int main()
{
std::ios::sync_with_stdio(false);
std::cout << "a\n";
std::printf("b\n");
std::cout << "c\n";
}
出力:
b
a
c
ソース: cppreference