performance-avoid-endl

检查流上 std::endl 的使用情况,并建议改用换行符 '\n'

理由:在流上使用 std::endl 可能不如使用换行符 '\n' 效率高,因为 std::endl 执行两个操作:它将换行符写入输出流,然后刷新流缓冲区。使用 '\n' 写入单个换行符不会触发刷新,这可以提高性能。此外,在处理缓冲流时,刷新流缓冲区会导致额外的开销。

示例

考虑以下代码

#include <iostream>

int main() {
  std::cout << "Hello" << std::endl;
}

会被转换为

#include <iostream>

int main() {
  std::cout << "Hello" << '\n';
}

此代码将单个换行符写入 std::cout 流,而不会刷新流缓冲区。

此外,需要注意的是,标准 C++ 流(如 std::cerrstd::wcerrstd::clogstd::wclog)在写入操作后总是刷新,除非 std::ios_base::sync_with_stdio 设置为 false。无论使用的是 std::endl 还是 '\n'。因此,在这些流上使用 '\n' 不会带来任何性能提升,但为了保持一致性和可读性,仍然建议使用 '\n'

如果您确实需要刷新流缓冲区,可以使用 std::flush 明确地执行此操作,例如

#include <iostream>

int main() {
  std::cout << "Hello\n" << std::flush;
}