缓冲区刷新:"n" vs. 标准::endl
Buffer flushing: " " vs. std::endl
可能重复:
C++:“std::endl";与“\n";
在加速C++中,提到了两件事:
-
大多数系统将字符写入输出设备需要相当长的时间。正因为如此,C++积累要写入缓冲区的字符,并等待缓冲区被刷新。
-
刷新缓冲区的一种方法是,如果我们使用
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
和其他专业。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- 使用库时的标准 - 使用库的数据类型 VS 创建我自己的类型?
- 标准::make_unique<T> vs 复位(新 T)
- RVO vs 标准::unique_ptr<>清理
- VS 链接器失败,标准::字符串方法出现"object already exists"错误
- Windows API,C++标准库,VS运行库,我应该使用哪一个
- 标准::auto_ptr vs. 标准::TR1::shared_ptr
- 旋转锁 vs 标准::互斥::try_lock.
- 性能标准::strstr vs. 标准::字符串::查找
- 在命名空间"名称"上: ::标准:: vs 标准::
- 下面的模板专门化代码是非标准的,或者是vs - c++中的错误
- 缓冲区刷新:"n" vs. 标准::endl
- 标准::static_pointer_cast vs static_cast<标准::shared_ptr<A>>
- 在VS中构建和运行C++标准"主"条目的控制台应用程序(2010)
- C++ 标准::前进<T> vs static_cast<T>
- <cstdint> VS 标准::size_t类型
- 可变参数列表vs单一模板参数:标准怎么说?
- 重定向标准I/O: freopen + stdin/stdout vs open + dup2