我从C跳到C++,借助“C++ Primer”(第5版)一书,作者在书中声明如下:
程序员经常在调试期间添加打印语句。这样的语句应该总是刷新流。否则,如果程序崩溃,输出可能会留在缓冲区中,从而导致对程序崩溃位置的错误推断。
但网上的帖子却不这么认为;有人说,不断刷新缓冲区对程序有害,并会导致性能问题。
我的问题:
std::endl?附注:
发布于 2016-02-23 16:42:46
第4和第3点
从第4点开始,因为其他一切都取决于它;第3点,因为它是紧密相关的。
当您刷新流时,您将获取由流存储的所有数据,并将其写入由流表示的底层介质。
当它被冲走的时候,它就会被完成,承诺,并准备被外部世界观察(或多或少)。操作系统和支持流的硬件也可能会延迟写入,但对此您无能为力)。你不能看它,直到它被冲洗过。如果它从来没有被冲过,你就不能读它。
问题是,您不想经常写入IO,因为任何超出CPU的东西与驻留在CPU中的东西相比,都要花费大量的时间。有时速度会慢上数万倍。在CPU内部,您有千兆赫兹和并行总线一次移动数据32或更多位。在外面,你有兆赫,通常一次移动一点。
以一个文件为典型的例子。不仅驱动器访问以CPU速度的很小的速度运行,而且如果每个字节直接进入磁盘,那么您可能不得不对每个字节进行访问。
太残暴了。想象一下,这样做几百次或几千次来编写一个字符串。但是,如果你只在字符串太大时才写,或者你已经完成了呢?如果你写的是扇区而不是字节呢?那你就可以
在一次尝试中,可能会有数千字节的操作。
第2点
第二点回到第四/第三点,你看不懂你不冲洗的东西。如果您想在屏幕上看到一个特定的输出,并且希望现在就看到它,那么您就可以刷新。如果您想在程序崩溃之前得到一条调试消息,并且很可能在没有将最后几条绝对必要的消息放到屏幕上的情况下终止,那么您可以刷新。历史上到处都是程序员寻找错误错误的地方,因为他们没有得到最后几条未刷新的错误消息。
当你需要看到一个重要的信息时,你会看到一个重要的信息,你正在用程序速度来换取相对的确定性。
第1点
std::endl既是行的末端,也是冲洗流的指令。你要少用它,只有当你需要线的末端和同花顺时才使用它。如果您不需要刷新,只需发送和结束行:'\n'。
接受Pete的建议,并在可能的情况下使用std::cerr进行错误和调试。这就是建造它的目的。它靠的是野蛮的力量和无知。这很痛苦。太慢了。而且几乎总是起作用。
发布于 2016-02-23 15:13:09
调试输出应该写入std::cerr;它的单元缓冲,因此每个字符都会被刷新。很少需要std::endl,并且养成使用它的习惯会导致神秘的缓慢代码。只需使用'\n',除非您知道需要刷新缓冲区。
发布于 2016-02-23 15:08:37
默认情况下,std::cout链接到stdout,这是.
充分缓冲的当且仅当可以确定流不引用交互设备时。
(C99,7.19.3档案,第7段)
这意味着,如果您的输出被发送到终端,std::endl和"\n"一开始就没有什么区别。;-)
关于你的实际问题:
都是真的:
--只有在添加“总是”后,才会出现问题。
什么时候应该使用
std::endl?
当你想冲洗缓冲区的时候。
作者是错的,还是我没有理解他所说的任何部分?
我认为绝对量词,如“总是”、“所有”、“从不”等,就风格/设计/等等而言,都应该加些盐。
(例外:永远不要调用未定义的行为。;-)
您能给出任何真实的场景,以满足实际需要冲洗输出流吗?
无论何时没有实际出现最新的输出,都是不可接受的。在任何给定的场景中,这种情况是否如此,都是判断的结果。
就我个人而言,我认为生产/事务日志比调试日志更重要。
https://stackoverflow.com/questions/35580919
复制相似问题