默认同步导致 cin/cout 极慢,需在 main 开头用 std::ios::sync_with_stdio(false) 关闭同步,并配 cin.tie(nullptr) 解绑输入输出流,禁用混用 printf/scanf 和 endl。

为什么 cin 和 cout 默认慢得像在等咖啡?
因为 C++ 标准库默认让 cin/cout 与 C 的 stdin/stdout 保持同步——每次调用都可能触发 fflush 或检查缓冲区一致性,带来严重开销。尤其在读写大量整数(比如 OJ 题目输入 10⁵ 行)时,这会拖慢 IO 十倍以上。
如何用一行代码关闭同步?
在 main() 开头、任何 cin 或 cout 操作之前,加这一行:
std::ios::sync_with_stdio(false);
它告诉 C++ IO 流:别管 stdio 了,自己管好自己的缓冲区就行。这是提速最关键的一步。
常见错误:
立即学习“C++免费学习笔记(深入)”;
- 放在
cin之后 —— 已经触发同步机制,再关无效 - 只关同步但没解绑
cin和cout—— 默认仍绑定,cout << endl会隐式 flushcout,连带刷cin缓冲,卡住
必须配套解绑 cin 和 cout
关闭同步后,还需解除 cin 对 cout 的自动刷新依赖,否则每次输出换行仍可能阻塞输入:
cin.tie(nullptr);
注意不是 cout.tie(nullptr) —— tie 是「谁被谁绑定」,cin.tie() 返回当前绑定到 cin 的输出流,默认是 &cout;设为 nullptr 就断开。
使用场景:
- 纯输入处理(如只读不输出):只需
sync_with_stdio(false),cin.tie可省 - 高频混合 IO(如边读边算边输出):两者都必须设
- 用了
printf/scanf混用?绝对禁止!关同步后混用会未定义行为
副作用和不能踩的坑
关同步后,cin/cout 和 scanf/printf 不能再共存。下面代码是危险的:
ios::sync_with_stdio(false);
cin >> x;
printf("%d", y); // ❌ UB!可能输出错乱或崩溃
另外,endl 会强制 flush,比 "\n" 慢很多,建议统一用 "\n"。
性能影响实测(10⁶ 个整数读入):
- 默认同步 +
endl:约 800ms - 关同步 +
cin.tie(nullptr)+"\n":约 120ms
真正容易被忽略的是:某些 IDE(如 Code::Blocks)或旧编译器(GCC sync_with_stdio 的实现有 bug,若提速不明显,先确认编译器版本和标准(推荐 -std=c++17)。


















