缓冲区刷新:"n" vs. 标准::endl

Buffer flushing: " " vs. std::endl

本文关键字:标准 vs endl 刷新 缓冲区      更新时间:2023-10-16

可能重复:
C++:“std::endl";与“\n";

加速C++中,提到了两件事:

  1. 大多数系统将字符写入输出设备需要相当长的时间。正因为如此,C++积累要写入缓冲区的字符,并等待缓冲区被刷新。

  2. 刷新缓冲区的一种方法是,如果我们使用std::endl明确地告诉它这样做。

这让我想知道:很明显,除了最大的输出之外,所有东西的好处都很小,而且不明显,但使用"n"比使用std::endl更快,或者"n"也会刷新缓冲区吗?

使用'\n'不会刷新缓冲区,而且确实比使用std::endl更快。

在典型的I/O中,输出在写入到预期设备之前进行缓冲。这样,当写入到访问速度较慢的设备(如文件)时,不必在每个字符之后访问设备。刷新会将缓冲区"刷新"到设备上,从而导致一定的性能开销。

-改编自:C++-endl并刷新缓冲区

我想补充一点,我认为将'n'写入流的意义可能与在第三方库中写入std::endl/std::flush不同。

例如,我在当前项目中使用基于ostream的记录器。该记录器使用std::stringstream功能进行输出格式化,但覆盖了用于刷新的操纵器。这允许在不刷新的情况下将'n'写入日志,并简化了代码。

这是一个伪代码示例:

class MyStream
{
    // [cut]
    std::stringstream m_buffer;
    // [cut]
};
// friends:
template <typename Printable>
MyStream& operator<<(MyStream& stream, const Printable& value)
{
     stream.m_buffer << value;
}
typedef decltype(std::flush) TManipulator;
template <>
MyStream& operator<<(MyStream& stream, const TManipulator& manipulator)
{
     if ( manipulator == std::flush || manipulator == std::endl )
         stream.sendLogLine();
     else
         stream.m_buffer << manipulator;
}
// usage sample
void main()
{
    getLoggerStream() << "hello" << std::endl;
}

附言:我不喜欢std::stringstream的子类,所以MyStream是一个适配器。如果我想进行'n'刷新,我应该重新实现更多的功能,包括char*std::string和其他专业。