在您声明此问题与this或that重复之前,请考虑我已使用and got WA向在线法官\n
提交了一个问题,然后使用std::endl
and got AC。所以,我需要一个非常具体的关于平台意识的答案:\n
真的是平台意识的,并且运行时真的根据平台写出正确的行尾作为其他问题的答案吗?如果是这样,你能告诉我这是怎么发生的吗?
如果答案可以得到标准中关于平台意识问题的引用的支持,我将非常感激。我已经阅读了所有其他问题的答案(甚至是封闭的答案),所以请不要重复“刷新缓冲区”的事情。
从C++11
, §27.7.3.8
-
namespace std
{
template <class charT, class traits>
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
}
效果:调用 os.put(os.widen('\n')),然后调用 os.flush()。
返回:os。
因此,从标准来看,很明显会endl
刷新输出流缓冲区,而\n
不会。通常你会想用它endl
来打印一个新行,但你也应该记住,每次你这样做时,输出缓冲区也会被刷新。
关于平台意识
从标准来看,很明显两者都做了完全相同的事情——以完全相同的方式打印新行。因此,如果一个是平台独立的,那么另一个也应该是相同的。因为我肯定知道endl
是平台独立的,所以\n
.
std::endl
是一个输出'\n'
,然后刷新流的操纵器。对于大多数随意使用,这是您应该使用的。但是,当输出大量数据时,可能会导致性能显着下降,在这种情况下,请使用'\n'
.
编辑:
关于平台意识:两者输出完全相同的东西。如果流是以文本模式打开的,'\n'
将导致出现与平台相关的行结束表示:Unix 下为 0x0A,Windows 下为 0x0D,0x0A,在某些大型机下开始一条新记录等。如果流以二进制打开模式,它将导致输出单个字节(通常为 0x0A,但实际上取决于所使用的基本字符编码)。