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::cerr
、std::wcerr
、std::clog
和 std::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;
}