包含的意义是什么
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。在这种情况下,它给出了一个分割错误。对此有什么可能的解释呢?
这两个调用有不同的含义,与性能无关;事实上,它加快了执行时间是(或可能是)一个副作用。您应该了解它们各自的作用,而不是盲目地将它们包含在每个程序中,因为它们看起来像是优化。
ios_base::sync_with_stdio(false);
这将禁用C和c++标准流之间的同步。默认情况下,所有标准流都是同步的,这在实践中允许您混合使用C和c++风格的I/O,并获得合理和预期的结果。如果你禁用了同步,那么c++流被允许拥有自己独立的缓冲区,这使得混合C和c++风格的I/O成为一种冒险。
还要记住,同步的c++流是线程安全的(来自不同线程的输出可能会交织,但不会产生数据竞争)。
cin.tie(NULL);
这样就把cin和cout分开了。绑定流确保在对另一个流进行每次I/O操作之前自动刷新一个流。
默认情况下,cin绑定到cout以确保合理的用户交互。例如:
std::cout << "Enter name:";
std::cin >> name;
如果cin和cout绑定,那么在程序提示用户输入之前,输出将被刷新(即在控制台上可见)。如果您解开流,程序可能会阻塞等待用户输入他们的名称,但“输入名称”消息还不可见(因为cout在默认情况下是缓冲的,输出只在需要时或缓冲区满时才会刷新/显示在控制台上)。
因此,如果将cin从cout中解绑定,则必须确保每次希望在cin上输入之前显示内容时都手动刷新cout。
总之,了解它们各自的作用,理解其后果,然后决定是否真的想要或需要提高速度可能带来的副作用。