gpt4 book ai didi

C++缓冲流IO

转载 作者:太空狗 更新时间:2023-10-29 19:39:37 24 4
gpt4 key购买 nike

我知道默认情况下,C++ 支持的所有流 IO 都是缓冲的。

这意味着要输出的数据被放入缓冲区直到它已满,然后发送到输出设备,类似地对于输入,一旦缓冲区为空就读取数据......所有这些都是为了使数字可以最大限度地减少昂贵的系统调用。

但是如何在行动中验证这种行为。我的意思是考虑以下代码

int main()
{
cout << "Hello world\n";
return 0
}

缓冲在哪里出现?我知道有缓冲发生,但如何解释呢?输出会立即显示在屏幕上,那么实际看到缓冲 I/O 的代码示例是什么?

最佳答案

首先,并不是所有的 iostream 都是缓冲的;缓冲由附加的处理 streambuf .在filebuf的情况下(由 ifstreamofstream ), 输入将尽可能多地读取,直到大小缓冲区,并且输出将在溢出时刷新缓冲区,当一个发生显式刷新或关闭,或者当对象被破坏时(这隐式调用关闭)。

案例cout有点特别,因为它永远不会被破坏,也不会关闭。系统保证 flush将在 exit 之后至少调用一次被称为(这是发生了什么当你从 main 返回时).这意味着之前的任何输出从 main 返回将被刷新;如果你使用 cout在静态对象的析构函数,您仍然需要显式刷新当然。

也可以tie输出流到输入流; cout绑定(bind)到 cin默认情况下。在这种情况下,任何尝试从绑定(bind)的流将刷新输出。

通常的约定是只使用 std::endl而不是简单地输出 '\n' ; std::endl输出 '\n'然后刷新溪流。对于出现所有输出非常重要的流立即,有一个unitbuf可以设置的标志,这意味着流将在每个 << 结束时被刷新运算符(operator)。(std::cerr 默认设置了此设置。)

最后,如果你想看缓冲的效果,放上类似 sleep(10)在你的输出之后。如果它立即出现输出,它已经酡;如果没有,它已经被缓冲,并且发生了刷新隐含在 sleep 之后.

关于C++缓冲流IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11392511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com