2

一个众所周知的事实是 cout 在 VS2010 中没有缓冲(参见 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::stream. 它发生在std::streambuf包含在 a 中的那个中std::stream。流的作用是将内容转换为某种字符串表示形式,并将转换后的内容发送到流缓冲区。无论是一次发送一个字节还是以更大的块发送它是(我认为)实现定义的。

您的代码有效,因为它都在一个线程中。当一切都在一个线程中时,您使用共享公共流缓冲区的两个流这一事实不是问题。调用hexout.operator<<在调用cout.operator<<开始之前完成。分号是一个序列点。

创建两个线程,一个 usinghexout和另一个cout,如果您不使用某种锁定机制保护写入,您可能会一团糟。

于 2013-01-26T01:17:00.960 回答