关于c ++:ios_base的意义:: sync_with_stdio(false);cin.tie(NULL);

Aki 发布于 2022-10-19 339 次阅读


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

上述两句代码有什么含义?

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


ios_base::sync_with_stdio(false);

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

还要记住,同步的C ++流是线程安全的(不同线程的输出可能会交错,但是你没有数据争用)。

当你使用了上述的语句后,在程序中只能使用cout和cin作为输出输入流,不可以使用printf和scanf了,如果使用则会造成不符合预期的效果。

cin.tie(NULL);

这从cout解开cin。绑定的流确保在另一个流上的每个I / O操作之前自动刷新一个流。

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

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

如果绑定了cin和cout,则可以在程序提示用户输入之前刷新输出(即在控制台上可见)。如果您解开流,程序可能会阻止等待用户输入其名称,但"输入名称"消息尚未显示(因为默认情况下cout是缓冲的,仅在需要时在控制台上刷新/显示输出或当缓冲区已满时。

因此,如果从cout解开cin,则必须确保每次要显示某些内容之前手动刷新cout,然后才能在cin上进行输入。

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

总结:

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

tie让您可以保证C ++世界中的IO通道彼此绑定,这意味着例如在输入发生之前已经刷新了每个输出(想想cout <<"What's your name ?"; cin >> name;)。

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

在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。