2

VS2010でcoutが抑制されていないことはよく知られている事実です(Stephan Lavavejによる投稿をここで参照してください)。以下のコードで、coutのバッファを使用してostream hexoutを構築できるのはなぜですか?

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    // Construct ostream hexout with cout's buffer and setup hexout to print hexadecimal numbers

    ostream hexout(cout.rdbuf());
    hexout.setf (ios::hex, ios::basefield);
    hexout.setf (ios::showbase);

    // Switch between decimal and hexadecimal output using the common buffer

    hexout << "hexout: " << 32 << " ";
    cout << "cout: " << 32 << " ";
    hexout << "hexout: " << -1 << " " ;
    cout << "cout: " << -1 << " ";
    hexout << endl;
}
4

2 に答える 2

2

すべてのストリームには、basic_streambufが関連付けられています。「バッファなし」とは、basic_streambufが入出力をバッファリングするための内部バッファ(メモリのチャンク)を維持せず、ファイル(またはコンソールなど)との間で直接読み取り/書き込みを行うことを意味します。

于 2013-01-26T01:13:23.900 に答える
1

バッファリング(またはその欠如)は、で直接発生しませんstd::streamstd::streambufに含まれているで発生しstd::streamます。ストリームが行うことは、コンテンツを何らかの文字列表現に変換し、その変換されたコンテンツをストリームバッファに送信することです。一度に1バイト送信するか、より大きなチャンクで送信するかは、(私が思うに)実装によって定義されます。

すべてが1つのスレッドにあるため、コードは機能します。すべてが1つのスレッドにある場合、共通のストリームバッファーを共有する2つのストリームを使用しているという事実は問題ではありません。toの呼び出しはhexout.operator<<、toの呼び出しが開始する前に完了しcout.operator<<ます。セミコロンはシーケンスポイントです。

hexout1つはを使用してもう1つはを使用して、2つのスレッドを作成coutします。ある種のロックメカニズムで書き込みを保護しないと、混乱する可能性があります。

于 2013-01-26T01:17:00.960 に答える