gpt4 book ai didi

c++ - std::flush 是如何工作的?

转载 作者:IT老高 更新时间:2023-10-28 12:12:15 26 4
gpt4 key购买 nike

有人可以解释(最好使用简单的英语)如何std::flush有效吗?

  • 它是什么?
  • 你什么时候刷新一个流?
  • 为什么重要?

  • 谢谢。

    最佳答案

    由于没有回答 std::flush 恰好是什么,这里有一些关于它实际是什么的细节。 std::flush 是一个操纵符,即具有特定签名的函数。从简单开始,您可以将 std::flush 视为具有签名

    std::ostream& std::flush(std::ostream&);

    但是,实际情况要复杂一些(如果您有兴趣,下面也会解释)。

    流类重载输出运算符采用这种形式的运算符,即,有一个成员函数将操纵器作为参数。输出运算符使用对象本身调用操纵器:
    std::ostream& std::ostream::operator<< (std::ostream& (*manip)(std::ostream&)) {
    (*manip)(*this);
    return *this;
    }

    也就是说,当您将 std::flushstd::ostream 一起“输出”时,它只是调用了相应的函数,即以下两个语句是等效的:
    std::cout << std::flush;
    std::flush(std::cout);

    现在, std::flush() 本身相当简单:它所做的只是调用 std::ostream::flush() ,也就是说,您可以设想它的实现看起来像这样:
    std::ostream& std::flush(std::ostream& out) {
    out.flush();
    return out;
    }
    std::ostream::flush() 函数在技术上调用与流相关的流缓冲区(如果有)上的 std::streambuf::pubsync():流缓冲区负责缓冲字符并将字符发送到外部目标,当使用的缓冲区溢出或内部表示应该同步时与外部目标,即,何时刷新数据。在与外部目标同步的顺序流上,任何缓冲的字符都会立即发送。也就是说,使用 std::flush 会导致流缓冲区刷新其输出缓冲区。例如,当数据写入控制台时,刷新会导致字符出现在控制台上的这一点。

    这可能会提出一个问题:为什么不立即写出字符?简单的答案是,写字符通常相当慢。但是,编写合理数量的字符所需的时间基本上与只编写一个字符所需的时间相同。字符的数量取决于操作系统、文件系统等的许多特征,但通常多达 4k 个字符与一个字符几乎同时写入。因此,在根据外部目标的详细信息使用缓冲区发送字符之前对其进行缓冲可以是一个巨大的性能改进。

    以上应该回答你的三个问题中的两个。剩下的问题是:你什么时候刷新流?答案是:什么时候应该将字符写入外部目的地!这可能是在写入文件结束时(尽管关闭文件会隐式刷新缓冲区)或在要求用户输入之前立即(请注意,当从 std::cout 读取时自动刷新 std::cin,因为 std::coutstd::istream::tie() 'd 到 std::cin 'd 到 65079)。尽管在某些情况下您可能明确想要刷新流,但我发现它们相当罕见。

    最后,我 promise 全面介绍 std::flush 的实际含义:流是能够处理不同字符类型的类模板(实际上它们与 charwchar_t 一起工作;使它们与另一个字符一起工作是相当复杂的,但如果你这样做是可行的真的确定了)。为了能够在流的所有实例化中使用 std::flush,它恰好是一个具有如下签名的函数模板:
    template <typename cT, typename Traits>
    std::basic_ostream<cT, Traits>& std::flush(std::basic_ostream<cT, Traits>&);

    当立即使用 std::flushstd::basic_ostream 实例化时,这并不重要:编译器会自动推导出模板参数。但是,如果此函数未与有助于模板参数推导的内容一起提及,则编译器将无法推导模板参数。

    关于c++ - std::flush 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14105650/

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