CppCoreGuidelines SL.io.50 避免使用 endl
01 January 2024
“Avoid endl
”
理由
endl
这个输入输出操作符跟 '\n'
和 "\n"
的效果是等价的。但是往往速度更慢,因为它会进行一次额外的 flush()
操作。相比 prinf
风格的代码,速度减慢会很明显。
例子
cout << "Hello, World!" << endl; // two output operations and a flush cout << "Hello, World!\n"; // one output operation and no flush
注意
对于 cin
和 cout
等操作,不太需要 flush
。因为 flush
一般都是自动完成的。往文件写东西的时候,很少需要用到 flush
。
注意
对于字符串流(尤其是 ostringstream
),插入一个 endl
完全等价于插入一个 '\n'
字符。然而, endl
会严重拖慢程序速度。
endl
也不会产生一个操作系统平台相关的行结束符(比如 Windows 上是
“\r\n”)。所以,对于字符串流, s << endl
只是插入了一个 '\n'
字符。
注意
除了很重要的性能上的考量,选择 '\n'
还是 endl
完全是一种美学偏好。