深入C++库分析sync_with_stdio实现

  • 关于sync_with_stdio(false)
  • 透过C++源码,认识sync_with_stdio()
  • 使用sync_with_stdio(false)后的效果
  • 输入输出结构

关于sync_with_stdio(false)

sync_with_stdio(false)具备的基本特性:

  1. 在C++中sync_with_stdio(false)是一种提升cin、cout效率的手段。
  2. 尽量在使用cin、cout前调用sync_with_stdio(false),因为cin、cout的特性在调用sync_with_stdio(false)前后有一定变化。
  3. 调用sync_with_stdio(false)后,scanf()、printf()和cin、cout混用将存在输入/输出顺序与调用顺序不一致。
  4. sync_with_stdio(false)属于不可逆操作。

透过C++源码,认识sync_with_stdio()

为了一探sync_with_stdio()中深刻的奥秘,索性去找了一份C++库的源码:

  1. std::ios::sync_with_stdio(false)属于不可逆操作,调用sync_with_stdio(false)后,cin、cout与stdin、stdout之间解锁同步,再次调用sync_with_stdio(false/true)均不生效。stdin、stdout是C库中的标准输入和标准输出,C库中诸如prinf()、putchar()、puts()等接口都是对接stdout,scanf()、getchar()、gets()等接口都是对接stdin,和stdin、stdout对接的设备一般也称之为终端设备,终端设备向下可以和串口、网络、内存或文件等对接,对接怎样的硬件设备,输入输出就将在哪里进行。
  2. sync_with_stdio(false)的核心动作在于解锁cin、cout和stdin、stdout之间的同步关系,为cin、cout、cerr、clog重新分配缓冲区,如果在C++中开启了宽字符,还将为wcin、wcout、wcerr、wclog执行类似动作。scanf()、printf()和cin、cout为保持同步是公用了同一buf(终端设备缓冲),访问共同的终端设备,以此保证scanf()、printf()和cin、cout混用,输入输出顺序与调用顺序一致。

使用sync_with_stdio(false)后的效果

使用sync_with_stdio(false)后有两点感受很明显:

  1. cin、cout效率提升明显。
  2. cout行缓冲特性。
    关于cout行缓冲,默认cout与stdout绑定在一起,cout不具备buf的管理权(buf管理权在终端设备),每次使用cout输出的内容都会直接交给stdout对应的设备,这种情况下cout行缓冲不生效。调用sync_with_stdio(false)后,cout具有自管理的buf,使用cout输出不会立即显示,都暂存在buf中,当输出达到一定长度时会将此前输出的内容显示出来,显示内容的容量由cout缓冲buf的大小决定,或者主动调用flush(),亦或者在cout结束添加endl(因为endl操作中包含了flush()),Windows和Linux上的C++都有这个特性。
    调用sync_with_stdio(false)后,cin、cout直接访问终端设备,cin效率与scanf()基本一致,cout效率与printf()基本一致。在运行代码时感受到cin、cout更高,也仅仅是C++上层处理数据的策略不同,部分应该是得益于C++的缓冲技术,输入输出的数据都会在C++自管理的buf中转一圈在到上层应用或到底层设备。
    看一段C++官方对于sync_with_stdio的描述:

输入输出结构

未执行sync_with_stdio(false),输入输出自上而下结构:

执行sync_with_stdio(false)后,输入输出自上而下结构:

深入C++库分析sync_with_stdio实现相关推荐

  1. python 颜色_如何使用python中matplotlib库分析图像颜色

    用代码分析图像可能很困难.你如何使代码"理解"图像的上下文? 通常,使用AI分析图像的第一步 是找到主要颜色.在如何使用python中matplotlib库分析图像颜色中,我们将使 ...

  2. Seurat的单细胞免疫组库分析来了!

    使用Seurat进行单细胞VDJ免疫分析 NGS系列文章包括NGS基础.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流程) ...

  3. python数据挖掘课程】十七.社交网络Networkx库分析人物关系(初识篇)

    #2018-03-30 09:21:39 March Friday the 13 week, the 089 day SZ SSMR python数据挖掘课程]十七.社交网络Networkx库分析人物 ...

  4. Kotlin协程核心库分析-5 Job异常处理器注意点

    本章我们简单探讨一下异常处理: 我们知道协程传入CoroutineExceptionHandler对象即可捕获异常,那么对于子协程是否适用呢? fun main() {val eChild = Cor ...

  5. stm32 HAL库分析之CAN

    stm32 HAL库分析之CAN 阻塞发送 HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout) ...

  6. 【机器学习】使用CatBoost库分析股票行情(指标为RSI、Boll、MACD和MA)并输出因子占比分析

    文章目录 前言 一.CatBoost是什么? 二.准备工作 2.1 MyTT 2.2 获取日K数据 2.3 安装CatBoost 三. 使用CatBoost库分析股票行情(完整源码) 总结 前言 随着 ...

  7. 【详解】Python数据分析第三方库分析

    Python数据分析第三方库分析 目录 Python数据分析第三方库分析 @常用库下载地址 1 Numpy 2 Matplotlib 3 Pandas 4 SciPy 5 Scikit-Learn 6 ...

  8. 深度学习库 caffe使用 源码分析 依赖库分析 caffe glog gflags openBlas prototxt yolo_darknet 转 caffe

    深度学习库 caffe使用 源码分析 依赖库分析 caffe glog gflags openBlas 本文github链接 yolo_darknet 转 caffe caffe 安装 Caffe代码 ...

  9. 一个R包玩转单细胞免疫组库分析,还能与Seurat无缝对接

    单细胞免疫组库数据分析 NGS系列文章包括NGS基础.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流程).单细胞测序分析  ...

  10. javascript 图表_我如何使用JavaScript数据透视表和图表库分析开发人员趋势

    javascript 图表 Hi, dev community! 嗨,开发者社区! Today I'd like to share my experience of analyzing develop ...

最新文章

  1. nginx 反向代理,动静态请求分离,proxy_cache缓存及缓存清除
  2. oracle解除锁表【原】
  3. Heap(堆结构/优先队列)-Swift实现
  4. html用jq设置动态效果,jQuery实现基本动画效果的方法详解
  5. 推荐四十多条纯干货 Java 代码优化建议
  6. MyBatis 源码解读-执行SQL
  7. css3中的 @Keyframes
  8. python-函数与变量的定义-标识符的命名规范
  9. modem (1)---手机主叫的信道流程与Modem Log简单分析
  10. [Android] 混音线程MixerThread
  11. nbu备份win平台oracle,NBU备份ORACLE错
  12. 最简单的dubbo教程-快速入门
  13. 黑马程序员全套Java教程_Java基础教程_API(十四)
  14. 手把手教您怎么编写第一个单片机程序
  15. Matlab:实现自定义圆孔阵列远场衍射仿真
  16. 推荐两款好用的视频压缩工具(在保证画质的情况下最大限度地压制)
  17. 周云蓬献唱《杜甫三章》实证“把古人唱成亲人”
  18. 凡事预则立不预则废---20180112
  19. 苏宁小BIU诞生日 机器人员工正式“入职”
  20. Flink-DataStream快速上手

热门文章

  1. 数据结构1800题-错题集-第二章
  2. 【hashcat help中文注释】
  3. winpe加载raid_winpe里添加raid驱动
  4. 产业变革新机遇,与5G同行,驰骋在浪潮之巅
  5. 基于BOW模型的图像检索
  6. setImageResource导致的ANR
  7. 从0开始,使用豆瓣数据集做一个基于FM和逻辑回归的电影推荐系统
  8. Java实现QQ、微信、新浪微博第三方登录
  9. iOS APP 逆向安全杂谈
  10. C语言冒泡排序算法详解