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

包含的意义是什么

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。在这种情况下,它给出了一个分割错误。对此有什么可能的解释呢?

195738 次浏览

使用ios_base::sync_with_stdio(false);足以解耦CC++流。你可以在Langer和Kreft的标准c++ IOStreams和locale中找到对此的讨论。他们指出,这是由实现定义的。

cin.tie(NULL)调用似乎要求在cincout上的活动之间解耦。我无法解释为什么在其他优化中使用这个会导致崩溃。如上所述,你提供的链接是坏的,所以这里没有猜测。

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

tie可以保证c++世界中的IOs通道彼此是,这意味着例如,每个输出都在输入发生之前被刷新(想想cout << "What's your name ?"; cin >> name;)。

你总是可以混合使用C或c++ IOs,但如果你想要一些合理的行为,你必须同步这两个世界。注意,一般不建议混合使用,如果你用C语言编程使用C stdio,如果你用c++编程使用流。但是,您可能希望将现有的C库混合到c++代码中,在这种情况下,需要同步两者。

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

ios_base::sync_with_stdio(false);

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

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

cin.tie(NULL);

这将从cout中解绑定cin。绑定流确保在对另一个流进行每次I/O操作之前自动刷新一个流。

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

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

如果cincout绑定,你可以期望输出在程序提示用户输入之前被刷新(即在控制台上可见)。如果你解开流,程序可能会阻塞等待用户输入他们的名字,但“输入名称”消息还不可见(因为cout在默认情况下是缓冲的,输出只在需要或缓冲区满时才会刷新/显示在控制台上)。

因此,如果你将cincout解绑定,你必须确保每次你想要在cin上输入之前显示一些东西时手动刷新cout

总之,了解它们各自的作用,理解结果,然后决定你是否真的想要或需要提高速度的可能的副作用。

这只是一些让cin输入工作更快的普通东西。

简单解释一下:第一行关闭了cin流和c风格的的头工具(如scanf或gets)之间的缓冲区同步——因此cin工作得更快,但你不能与的头工具同时使用它。

第二行将cincout分离——默认情况下,每次从cin读取内容时,cout缓冲区都会刷新。当你反复读一些小的东西,然后写很多次小的东西时,可能会很慢。因此这一行关闭了同步(通过将cin绑定到而不是cout)。

有很多很好的答案。我只是想添加一个关于解耦流的小注释。

cin.tie(NULL);

在将流与CodeChef平台分离时,我遇到了一个问题。当我提交我的代码时,平台的回复是“错误的答案”。但是在绑定流和测试提交之后。它工作。

因此,如果有人想要解开流,则必须刷新输出流。