1、std::endl
输出一个换行符 \n
,强制刷新输出缓冲区(flush)。
#include<iostream>
using namespace std;
int main() {
cout << "Hello" << endl;
return 0;
}
2、\n
仅输出一个换行符,不刷新缓冲区(除非遇到某些条件,如缓冲区满、程序结束等)
#include<iostream>
using namespace std;
int main() {
cout << "Hello\n";
return 0;
}
3、性能比较
std::endl
性能开销更大,每次使用 std::endl
都会触发一次 输出缓冲区刷新(std::flush
),这在频繁输出时会显著影响性能。
#include<iostream>
using namespace std;
int main() {
for (int i = 0; i < 100000; ++i) {
std::cout << "line " << i << '\n'; // 更快
// std::cout << "line " << i << std::endl;
// 慢,因为每次都刷新缓冲区
}
return 0;
}
使用 \n
可以推迟刷新操作,提高效率,适合大批量输出。
4、输出缓冲区刷新机制
刷新输出缓冲区意味着立即将内容写入终端或文件,而不是等待缓冲区填满或程序结束。
std::endl
适用于希望用户立刻看到输出,输出到日志或实时信息时,遇到错误输出时(例如配合 std::cerr
)。
\n
适用于输出量大且对性能要求高的程序,不要求即时显示的日志或数据流输出。
5、其他相关函数
std::flush
刷新缓冲区,不换行,std::ends
输出空字符 \0
并刷新缓冲区。
#include <iostream>
#include <fstream>
int main() {
// 示例 1: std::flush —— 立即刷新输出缓冲区
std::cout << "Hello, " << std::flush;
std::cout << "world!" << std::endl;
// 示例 2: std::ends —— 插入一个空字符(\0),常用于输出到内存缓冲区
char buffer[50];
std::ostringstream oss(buffer); // 创建输出字符串流
oss << "Hello" << std::ends; // 添加 \0
std::cout << "String with std::ends: " << oss.str().c_str() << std::endl;
// 示例 3: 输出到文件也能使用 std::flush
std::ofstream ofs("output.txt");
ofs << "This is written immediately." << std::flush;
ofs.close();
return 0;
}
std::flush
用于确保及时输出(如日志、进度条),std::ends
很少直接用于终端输出,主要用于需要 \0
结尾的内存缓冲区,如 ostringstream
。