ios_base::sync_with_stdio(false) 的意义; cin.tie(NULL);

新手上路,请多包涵

包含有什么意义

ios_base::sync_with_stdio(false);
cin.tie(NULL);

在 C++ 程序中?

在我的测试中,它加快了执行时间,但是我应该担心包含这个的测试用例吗?

这两个语句是否总是必须在一起,还是第一个就足够了,即忽略 cin.tie(NULL)

此外,如果其值已设置为 false 是否允许同时使用 C 和 C++ 命令?

https://www.codechef.com/viewsolution/7316085

上面的代码运行良好,直到我在 C++ 程序中使用 scanf/printf ,其值为 true 。在这种情况下,它给出了分段错误。这可能是什么解释?

原文由 Kshitij Kohli 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

这两个调用有不同的含义,与性能无关; 它加快执行时间 的事实是(或 _可能是_)只是一个副作用。您应该了解它们每个人的作用,而不是盲目地将它们包含在每个程序中,因为它们看起来像是一种优化。

 ios_base::sync_with_stdio(false);

这将禁用 C 和 C++ 标准流之间的同步。默认情况下,所有标准流都是同步的,这实际上允许您混合 C 和 C++ 样式的 I/O 并获得合理和预期的结果。如果禁用同步,则允许 C++ 流拥有自己的独立缓冲区,这使得混合 C 和 C++ 风格的 I/O 成为一种冒险。

还要记住,同步的 C++ 流是线程安全的(来自不同线程的输出可能会交错,但不会出现数据竞争)。

 cin.tie(NULL);

这将 cincout 。绑定流确保在对另一个流执行每个 I/O 操作之前自动刷新一个流。

默认情况下 cin 绑定到 cout 以确保合理的用户交互。例如:

 std::cout << "Enter name:";
std::cin >> name;

如果 cincout 并列,您可以预期在程序提示用户输入之前输出会被刷新(即,在控制台上可见)。如果您解开流,程序可能会阻止等待用户输入他们的姓名,但“输入姓名”消息尚不可见(因为 cout 默认情况下被缓冲,输出被刷新/显示在仅在需要时或缓冲区已满时控制台)。

So if you cin from cout , you must make sure to flush cout every time you want to display something before expecting input on cin .

总之,知道他们每个人做了什么,了解后果,然后决定你是否真的想要或需要速度提高 可能 产生的副作用。

原文由 Ionut 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是为了同步来自 C 和 C++ 世界的 IO。如果你同步了,那么你就可以保证所有 IO 的顺序都是你所期望的。一般来说,问题是导致问题的 IO 缓冲,同步让两个世界共享相同的缓冲区。例如 cout << "Hello"; printf("World"); cout << "Ciao"; ;如果没有同步,你永远不会知道你是否会得到 HelloCiaoWorldHelloWorldCiaoWorldHelloCiao

tie 让您保证 C++ 世界中的 IO 通道相互 关联,这意味着例如在输入发生之前每个输出都已刷新(想想 cout << "What's your name ?"; cin >> name; )。

您始终可以混合使用 C 或 C++ IO,但如果您想要一些合理的行为,则必须同步这两个世界。请注意,通常不建议将它们混合使用,如果您使用 C 编程,则使用 C stdio,如果您使用 C++ 编程,则使用流。但是您可能希望将现有的 C 库混合到 C++ 代码中,在这种情况下,需要对两者进行同步。

原文由 Jean-Baptiste Yunès 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题