小编典典

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

all

包含有什么意义

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

在 C++ 程序中?

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

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

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

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

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


阅读 20

收藏
2022-05-13

共1个答案

小编典典

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

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默认情况下缓冲,输出仅在需要时刷新/显示在控制台上或当缓冲区已满)。

所以如果你解开cincout你必须确保cout每次你想在期待输入之前手动刷新cin

总之,了解他们每个人的工作,了解后果,然后决定您是否真的想要或需要提高速度的 可能 副作用。

2022-05-13