关闭C scanf的cin同步的缺点

3
我最近从这个问题中学到了一些关于C++中cinscanf速度比较的知识。普通情况下,调用cin对象比调用scanf函数慢得多,但是当我阅读了被接受的答案后,我明白了如果我们调用std::ios::sync_with_stdio(false);,则cinscanf的同步被关闭,cin的速度变得更快,甚至在这种情况下比scanf更快。

那么,如果我们关闭它会遇到什么问题吗?如果有的话,有哪些问题?在C中关闭cin同步是否好?感谢您的帮助。

2个回答

7
如果你在同一个流(例如,stdin 流同时与 scanfcin 相关联)上同时使用两个 I/O 函数集 (<cstdio><stdio.h> 头文件和 <iostream>), 那么最好让它们保持同步。
如果任何一个流只使用一个 I/O 函数族,那么你可以关闭同步(例如,你可以将特定的文件与 fscanf 一起使用,而将 stdincin 一起使用,只要涉及到不同的流即可)。

5
“向后兼容性”比“默认快速”更重要。在有效地共享缓冲区的基础上,消除同步成本似乎比尝试默认禁用同步更有价值。 - Ben Voigt
@NathanPierson:你需要关闭同步的主要时间就是当你根本不混合两者时。如果程序根本不使用C风格的I/O,那么小心使用弱外部符号可能会让你自动化非同步访问。 - Jerry Coffin
@BenVoigt:是的,处理这个问题会很棘手。我需要仔细思考才能确定,但我的直觉告诉我,我并不完全相信它不能被很好地处理(但肯定需要比我最初考虑的更多)。 - Jerry Coffin
@JerryCoffin:似乎更容易构建一个统一的缓冲层,使得stdio和iostreams可以共享,并支持它们都使用的任何特性(块获取和取消获取),以便没有同步的惩罚。 - Ben Voigt
@BenVoigt: 可能是的。 - Jerry Coffin
显示剩余2条评论

4

基本上问题可能出现在同时使用C API时。 可能会出现许多奇怪的现象:数据丢失、顺序错误、意外错误。

如果您完全控制整个代码堆栈,并且可以确保不使用C API,则可以避免此类问题。

不幸的是,通常您的应用程序使用第三方库。 其中之一可以使用C API将某些数据输出到流中(特别是其中一个是C库)。 由于您无法控制第三方库的行为,因此需要进行同步。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接