C++ 何时必须以C++;脸红?
我知道这取决于你在做什么。例如,如果您正在使用控制台警告用户有一个较长的进程。。。在同一行中打印一系列点。。。冲洗可能很有趣。对于正常输出,每行一行,您不应该关心刷新 因此,对于基于字符的输出或非基于行的控制台输出,可能需要刷新。对于基于行的输出,它按预期工作 另一个答案可以澄清您的问题,基于为什么出于性能原因,避免endl和手动刷新可能是好的:C++ 何时必须以C++;脸红?,c++,coding-style,C++,Coding Style,我知道这取决于你在做什么。例如,如果您正在使用控制台警告用户有一个较长的进程。。。在同一行中打印一系列点。。。冲洗可能很有趣。对于正常输出,每行一行,您不应该关心刷新 因此,对于基于字符的输出或非基于行的控制台输出,可能需要刷新。对于基于行的输出,它按预期工作 另一个答案可以澄清您的问题,基于为什么出于性能原因,避免endl和手动刷新可能是好的: 关于什么是刷新:当您向缓冲流(如ostream)写入数据时,您无法保证数据已到达目标设备(控制台、文件等)。这是因为流可以使用中间缓冲区来保存数据,
关于什么是刷新:当您向缓冲流(如ostream)写入数据时,您无法保证数据已到达目标设备(控制台、文件等)。这是因为流可以使用中间缓冲区来保存数据,而不会停止程序。通常,如果缓冲区足够大,它们将保存所有数据,并且不会因为I/O设备速度慢而停止程序。您可能已经注意到控制台非常慢。flush操作告诉流您希望确保所有中间数据都到达目标设备,或者至少它们的缓冲区现在是空的。这对于日志文件非常重要,例如,您希望确保(不是100%)一行将位于磁盘上,而不是某个缓冲区中。如果您的程序不能释放数据,也就是说,如果程序崩溃,您需要确保您已经尽了最大努力将数据写入磁盘,那么这一点就变得更加重要。对于其他应用程序,性能更为重要,例如,您可以让操作系统决定何时为您刷新缓冲区,或者等待您关闭流。刷新强制输出流写入任何缓冲字符
它取决于您的应用程序,在实时或交互式应用程序中,您需要立即刷新它们,但在许多情况下,您可以等到关闭文件,然后让程序自动刷新它。出于性能原因,I/O库缓冲发送到流的数据。每当您需要确保数据已实际发送到流时,都需要刷新它(否则它可能仍在缓冲区中,并且在屏幕或文件中不可见) 有些操作会自动刷新流,但也可以显式调用类似于ostream::flush的东西 您需要确保数据被刷新,例如,当您有其他程序等待来自第一个程序的输入时
何时C++中的输出流必须刷新?< /P> 当您希望确保写入该文件的数据对其他程序可见,或(对于文件流)对读取同一文件的其他流可见,而该文件未绑定到此文件;当您想要确保即使程序异常终止也会写入输出时
因此,在长时间计算之前打印消息时,或者在打印消息以指示出错时,您可能希望执行此操作(尽管您通常会使用cerr
,它在每次输出后自动刷新)
通常无需在读取cin
之前刷新cerr
(默认情况下,其unitbuf
标志设置为每次输出后刷新),或在读取cin
之前刷新cout
(这些流被绑定,以便在读取cin
之前自动刷新cout
)
如果程序的目的是产生大量输出,无论是输出到cout
还是输出到一个文件,那么不要在每行之后刷新-这可能会显著降低速度
法拉盛到底是什么
输出流包含内存缓冲区,其写入速度通常比底层输出快得多。输出操作将数据放入缓冲区;刷新会将其发送到最终输出。如果您正在编写一个带有频繁空格的大文件,刷新可能会带来灾难性后果 比如说
for(int i = 0 ;i < LARGENUMBER;i++)
{//Slow?
auto point = xyz[i];
cout<< point.x <<",",point.y<<endl;
}
for(int i=0;i 首先,你读错了。无论你是使用std::endl
还是'\n'
很大程度上取决于上下文,但当有疑问时,std::endl
正常默认值。使用'\n'
保留给以下情况:
你事先知道冲水是没有必要的,而且
费用太高了
刷新涉及缓冲。当您向
数据流(通常)不会立即写入
系统;它被简单地复制到一个缓冲区中,缓冲区将被写入
文件已满,或文件已关闭。或
显式刷新。这是出于性能原因:系统
呼叫通常是一项相当昂贵的操作,而且通常是
对每个角色都这么做不是个好主意历史上,
C有一种叫做行缓冲模式的东西,它用
每个'\n'
,结果是这是一个很好的压缩
对于大多数事情,由于各种技术原因,C++没有
拥有它;使用std::endl
是C++实现同样目标的方法
结果
我的建议是只使用std::endl
,直到您
开始出现性能问题。如果没有其他问题,则
调试更简单。如果您想更进一步,可以
当您在一段时间内输出一系列行时,请使用'\n'
一些声明还有一些特殊情况,比如日志记录,
您可能希望显式控制冲洗的位置
for(int i = 0 ;i < LARGENUMBER;i++)
{//faster
auto point = xyz[i];
cout<< point.x <<",",point.y<<"\n";
}
for(int i = 0 ;i < LARGENUMBER;i++)
{//fastest?
auto point = xyz[i];
printf("%i,%i\n",point.x,point.y);
}