包括什么意义
ios_base::sync_with_stdio(false);
cin.tie(NULL);
Run Code Online (Sandbox Code Playgroud)
在C++程序中?
在我的测试中,它加快了执行时间,但有一个测试用例,我应该担心包含这个吗?
这两个陈述总是必须在一起,或者第一个是否足够,即忽略cin.tie(NULL)?
此外,如果其值已设置为false?允许同时使用C和C++命令吗?
https://www.codechef.com/viewsolution/7316085
上面的代码运行正常,直到我scanf/printf在C++程序中使用值为true.在这种情况下,它给出了分段错误.可能的解释是什么?
Ion*_*nut 175
这两个调用具有不同的含义,与性能无关; 它加快执行时间的事实是(或可能是)副作用.您应该了解每个程序的作用,而不是盲目地将它们包含在每个程序中,因为它们看起来像是一种优化.
ios_base::sync_with_stdio(false);
Run Code Online (Sandbox Code Playgroud)
这会禁用C和C++标准流之间的同步.默认情况下,所有标准流都是同步的,这实际上允许您混合使用C和C++样式的I/O并获得合理的预期结果.如果禁用同步,则允许C++流具有自己的独立缓冲区,这使得混合C和C++风格的I/O成为一种冒险.
还要记住,同步的C++流是线程安全的(不同线程的输出可能会交错,但是你没有数据争用).
cin.tie(NULL);
Run Code Online (Sandbox Code Playgroud)
这解开cin了cout.绑定的流确保在另一个流上的每个I/O操作之前自动刷新一个流.
默认情况下cin绑定以cout确保合理的用户交互.例如:
std::cout << "Enter name:";
std::cin >> name;
Run Code Online (Sandbox Code Playgroud)
如果cin并且cout被绑定,您可以期望在程序提示用户输入之前刷新输出(即,在控制台上可见).如果解开流,程序可能会阻止等待用户输入其名称,但"输入名称"消息尚未显示(因为cout默认情况下是缓冲的,只有在需要时才会在控制台上刷新/显示输出缓冲区已满.
所以,如果你解开cin的cout,你必须确保刷新cout要显示的期望输入之前的东西,每次手动cin.
总之,要知道他们每个人做了什么,了解后果,然后决定你是否真的想要或需要速度提升的可能副作用.
小智 12
这只是使cin输入运行得更快的常见东西。
\n\n快速解释一下:第一行关闭cin流和 C 风格stdio工具(如 scanf 或 gets)\xe2\x80\x94 之间的缓冲区同步,因此cin工作得更快,但不能与stdio工具同时使用它。
\n\n第二行将cin与cout \xe2\x80\x94 解开,默认情况下,每次从cin读取内容时,cout缓冲区都会刷新。当您反复读取一些小内容然后多次写入一些小内容时,这可能会很慢。因此该行关闭了此同步(通过将cin逐字地绑定到null而不是cout)。
\nJea*_*nès 10
这是为了同步来自C和C++世界的IO.如果您进行同步,那么您可以保证所有IO的订单正是您所期望的.一般来说,问题是导致问题的IO的缓冲,同步让两个世界共享相同的缓冲区.例如cout << "Hello"; printf("World"); cout << "Ciao";; 没有同步你永远不会知道你是否会得到HelloCiaoWorld或HelloWorldCiao或WorldHelloCiao...
tie让您保证C++世界中的IO通道彼此绑定,这意味着例如在输入发生之前已经刷新了每个输出(想一想cout << "What's your name ?"; cin >> name;).
您可以随时混合C或C++ IO,但如果您想要一些合理的行为,则必须同步两个世界.请注意,一般不建议将它们混合使用,如果使用C编程使用C stdio,并且使用C++编程使用流.但是您可能希望将现有的C库混合到C++代码中,在这种情况下需要同步两者.
使用ios_base::sync_with_stdio(false);足以解耦C和C++流。您可以在 Langer 和 Kreft 撰写的Standard C++ IOStreams and Locales中找到对此的讨论。他们指出,其工作原理是由实现定义的。
该cin.tie(NULL)调用似乎要求cin和上的活动脱钩cout。我无法解释为什么将此与其他优化一起使用会导致崩溃。如前所述,您提供的链接是错误的,因此这里不进行猜测。