Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 何时必须以C++;脸红?_C++_Coding Style - Fatal编程技术网

C++ 何时必须以C++;脸红?

C++ 何时必须以C++;脸红?,c++,coding-style,C++,Coding Style,我知道这取决于你在做什么。例如,如果您正在使用控制台警告用户有一个较长的进程。。。在同一行中打印一系列点。。。冲洗可能很有趣。对于正常输出,每行一行,您不应该关心刷新 因此,对于基于字符的输出或非基于行的控制台输出,可能需要刷新。对于基于行的输出,它按预期工作 另一个答案可以澄清您的问题,基于为什么出于性能原因,避免endl和手动刷新可能是好的: 关于什么是刷新:当您向缓冲流(如ostream)写入数据时,您无法保证数据已到达目标设备(控制台、文件等)。这是因为流可以使用中间缓冲区来保存数据,

我知道这取决于你在做什么。例如,如果您正在使用控制台警告用户有一个较长的进程。。。在同一行中打印一系列点。。。冲洗可能很有趣。对于正常输出,每行一行,您不应该关心刷新

因此,对于基于字符的输出或非基于行的控制台输出,可能需要刷新。对于基于行的输出,它按预期工作

另一个答案可以澄清您的问题,基于为什么出于性能原因,避免endl和手动刷新可能是好的:


关于什么是刷新:当您向缓冲流(如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);
}