std::endl与"\n"区别
-
使用 std::endl 插入到输出流中时,它不仅会在流中插入新的一行,还会强制刷新(flush)流的缓冲区。这意味着它会确保输出被立即写入到目标设备(例如终端或文件),而不是等待缓冲区被填满或显式刷新。
-
使用 '\n' 字符在流中插入新行,但不会强制刷新缓冲区。这意味着如果有缓冲区,它可能会等到缓冲区被填满或手动刷新时才将内容写入目标设备。
-
总体来说,使用 '\n' 在大多数情况下更加高效,因为它避免了不必要的缓冲区刷新。只有在确实需要强制刷新缓冲区时,才考虑使用 std::endl。
在很多情况下,终端的输出是行缓冲的,这意味着只要遇到换行符('\n')或者缓冲区满了,内容就会被刷新到终端。因此,在简单的例子中可能不会看到明显的区别。
如果想更明显地体现出行缓冲的特性,可以禁用行缓冲,或者在文件输出时进行观察。
#include <iostream>
#include <fstream>
int main() {
// 禁用行缓冲
std::cout.setf(std::ios::unitbuf);
// 使用 '\n',插入新行,但不刷新缓冲区(可能会被立即输出:确实)
std::cout << "This is a line with '\\n'." << '\n';
// 在文件中输出,观察行缓冲的效果
std::ofstream outFile("endl.txt");
// 使用 '\n',插入新行,但不刷新缓冲区(可能不会立即输出到文件:确实)
outFile << "This is a line with '\\n'." << '\n';
// 手动刷新缓冲区到文件
outFile << "This line is manually flushed." << std::flush;//使用 std::flush 或 std::endl 可以手动刷新缓冲区
return 0;
}