只是阅读"斯科特迈耶斯"的一篇古老但有趣的文章
http://aristeia.com/Papers/C++ReportColumns/novdec95.pdf
基本上它是关于宁愿使用'\n'过std::endl(我同意,并使用相同的扩充年).
但是最后一部分表明这不包含在他的书中,因为整个事情由于两点而变得没有实际意义:
std::cout 没有缓冲.ios::unitbuf未明确定义on std :: cout 的状态(因此依赖于实现).我做了一个快速查看,但找不到明确的标准参考1是真的.是否std::cout与我一直以来的理解相反?
Mik*_*our 18
是的,它是缓冲的:
C++ 11 27.4.2 [narrow.stream.objects]/3:对象
cout控制输出到与对象关联的流缓冲区stdout
本文引用了1995年草案版的C++ 98标准.我不知道这是否可能有所不同.
至于第2点,unitbuf是在所有的流(由的后置条件指定最初为false basic_ios的构造函数),除了cerr和wcerr其明确指定,否则.同样,在提到的古代草案中可能会有所不同.
Jam*_*nze 10
首先,没有要求std::cout(或甚至std::cerr)无缓冲.唯一的要求是,std::cerr已经
std::basic_ios::unitbuf设置(使得其将在每个输出功能的结束冲洗:<<或非格式化输出功能).另一方面,除非你调用,否则std::basic_ios::sync_with_stdio(false)输出到C++流并输出到相应的C流(即std::cout和stdout)必须具有相同的效果.从理论上讲,这可以通过几种方式完成:stdout函数可以转发到std::cout,std::cout输出可以转发
stdout,或者它们可以共享一些常见的缓冲区实现.在实践中,几乎所有实现都std::cout
转发到stdout.
C指定stderr不完全缓冲,并且stdout只有在可以确定不参考交互设备时才可以完全缓冲(对于某些实现定义的"交互设备"的含义).通常,stdout将是行缓冲(iostream中不存在的概念),并且stderr将是无缓冲的,但是C标准无法保证(今天可能不是这样 - 我最后一次看到的是二十多年前).总之,实现这只是转发到stdout将遵循C实现其转发到的,这并不"仍需要采取一些步骤,以确保输出的规则,以及一个
std::cout和stdout正确的顺序出来,而stdout
表现",仿佛"它遵守C规则.
如果你担心性能,那么你可能想要进行一些试验.尝试测量输出到std::ofstream
你自己打开的时间,输出到
std::cout(有和没有被调用sync_with_stdio)的时间,输出被重定向.差异应该很有趣.
C++标准将所有输入和输出定义为"好像"所有读取和写入最终都是通过C流的读取和写入发生的([iostream.objects.overview]):
标头声明了将对象与(27.9.2)中声明的函数提供的标准C流相关联的对象,并包括使用这些对象所需的所有标头.
对于附加到这些对象的标准C流的行为,我们必须参考C标准(第7.19.3节):
在程序启动时,预定义了三个文本流,无需明确打开 - 标准输入(用于读取常规输入),标准输出(用于写入常规输出)和标准错误(用于写入诊断输出).最初打开时,标准错误流未完全缓冲; 当且仅当可以确定流不参考交互设备时,标准输入和标准输出流被完全缓冲.
这里我引用的是C99标准,但我可以肯定地确定(部分编号的模数变化)与C标准的所有版本相同.