【问题标题】:Disadvantages of turning off cin synchronization with C scanf用C scanf关闭cin同步的坏处
【发布时间】:2021-05-10 03:48:16
【问题描述】:

我最近从this question 那里学到了一些关于C++ 中cin 的知识,并将其速度与C 中scanf 的速度进行了比较。调用cin 对象比像往常一样调用scanf 函数要慢得多,但是当我正在阅读接受的答案,我明白如果我们调用std::ios::sync_with_stdio(false);cinscanf 的同步被关闭,cin 的速度变得如此之快,甚至比scanf 在这种情况下更快。

那么,如果我们关闭它,我们会面临一些问题吗?如果是这样,有什么问题,在 C 中关闭 cinscanf 的同步是否很好?感谢您的帮助。

【问题讨论】:

    标签: c++ c synchronization scanf cin


    【解决方案1】:

    当同时使用 C API 时,基本上会出现问题。可能会出现许多奇怪的工件:缺少数据、错误顺序、意外错误。

    您可以完全控制整个代码堆栈,并且可以确保不使用 C API。

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

    【讨论】:

      【解决方案2】:

      如果您在同一流上使用两组 I/O 函数(标头 <cstdio><stdio.h> 以及 <iostream>)(例如,stdin 流与 scanfcin 相关联),那么你最好让它们保持同步。

      如果任何一个流只使用一个 I/O 系列,您可以关闭同步(例如,您仍然可以将fscanf 用于特定文件,将cin 用于stdin,只要涉及单独的流) .

      【讨论】:

      • 不混合C和C++ I/O是否还需要手动关闭同步?这似乎是 C++ 的“默认快速”理念的一个奇怪的例外。人们会期望性能悲观的同步选择加入。
      • @NathanPierson:向后兼容是一个比默认快速的更大目标。在同步成本消失的情况下,以一种有效的方式共享缓冲区似乎比在默认情况下尝试禁用同步更值得。
      • @NathanPierson:您想要关闭同步的第一次正是如此——当您根本不混合两者时。如果程序根本不使用任何 C 风格的 I/O,小心使用弱外部符号可能会让您自动执行非同步访问。
      • @JerryCoffin:这不能在任何支持 (a) 动态加载和 (b) C 和 C++ 标准库的共享库的系统上运行,因为程序可以动态加载一个新库随时使用 C API,包括在 iostreams 开始缓冲数据之后。
      • @BenVoigt:是的,处理这个问题充其量是很棘手的。我必须考虑一下才能确定,但​​我的直接反应是,我并不完全相信它也无法处理(但肯定需要超过我在考虑什么)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 2021-12-29
      • 1970-01-01
      • 2012-02-21
      相关资源
      最近更新 更多