深入C++库分析sync_with_stdio实现
深入C++库分析sync_with_stdio实现
- 关于sync_with_stdio(false)
- 透过C++源码,认识sync_with_stdio()
- 使用sync_with_stdio(false)后的效果
- 输入输出结构
关于sync_with_stdio(false)
sync_with_stdio(false)具备的基本特性:
- 在C++中sync_with_stdio(false)是一种提升cin、cout效率的手段。
- 尽量在使用cin、cout前调用sync_with_stdio(false),因为cin、cout的特性在调用sync_with_stdio(false)前后有一定变化。
- 调用sync_with_stdio(false)后,scanf()、printf()和cin、cout混用将存在输入/输出顺序与调用顺序不一致。
- sync_with_stdio(false)属于不可逆操作。
透过C++源码,认识sync_with_stdio()
为了一探sync_with_stdio()中深刻的奥秘,索性去找了一份C++库的源码:
- 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对接的设备一般也称之为终端设备,终端设备向下可以和串口、网络、内存或文件等对接,对接怎样的硬件设备,输入输出就将在哪里进行。
- 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)后有两点感受很明显:
- cin、cout效率提升明显。
- 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实现相关推荐
- python 颜色_如何使用python中matplotlib库分析图像颜色
用代码分析图像可能很困难.你如何使代码"理解"图像的上下文? 通常,使用AI分析图像的第一步 是找到主要颜色.在如何使用python中matplotlib库分析图像颜色中,我们将使 ...
- Seurat的单细胞免疫组库分析来了!
使用Seurat进行单细胞VDJ免疫分析 NGS系列文章包括NGS基础.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流程) ...
- python数据挖掘课程】十七.社交网络Networkx库分析人物关系(初识篇)
#2018-03-30 09:21:39 March Friday the 13 week, the 089 day SZ SSMR python数据挖掘课程]十七.社交网络Networkx库分析人物 ...
- Kotlin协程核心库分析-5 Job异常处理器注意点
本章我们简单探讨一下异常处理: 我们知道协程传入CoroutineExceptionHandler对象即可捕获异常,那么对于子协程是否适用呢? fun main() {val eChild = Cor ...
- stm32 HAL库分析之CAN
stm32 HAL库分析之CAN 阻塞发送 HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout) ...
- 【机器学习】使用CatBoost库分析股票行情(指标为RSI、Boll、MACD和MA)并输出因子占比分析
文章目录 前言 一.CatBoost是什么? 二.准备工作 2.1 MyTT 2.2 获取日K数据 2.3 安装CatBoost 三. 使用CatBoost库分析股票行情(完整源码) 总结 前言 随着 ...
- 【详解】Python数据分析第三方库分析
Python数据分析第三方库分析 目录 Python数据分析第三方库分析 @常用库下载地址 1 Numpy 2 Matplotlib 3 Pandas 4 SciPy 5 Scikit-Learn 6 ...
- 深度学习库 caffe使用 源码分析 依赖库分析 caffe glog gflags openBlas prototxt yolo_darknet 转 caffe
深度学习库 caffe使用 源码分析 依赖库分析 caffe glog gflags openBlas 本文github链接 yolo_darknet 转 caffe caffe 安装 Caffe代码 ...
- 一个R包玩转单细胞免疫组库分析,还能与Seurat无缝对接
单细胞免疫组库数据分析 NGS系列文章包括NGS基础.转录组分析 (Nature重磅综述|关于RNA-seq你想知道的全在这).ChIP-seq分析 (ChIP-seq基本分析流程).单细胞测序分析 ...
- javascript 图表_我如何使用JavaScript数据透视表和图表库分析开发人员趋势
javascript 图表 Hi, dev community! 嗨,开发者社区! Today I'd like to share my experience of analyzing develop ...
最新文章
- nginx 反向代理,动静态请求分离,proxy_cache缓存及缓存清除
- oracle解除锁表【原】
- Heap(堆结构/优先队列)-Swift实现
- html用jq设置动态效果,jQuery实现基本动画效果的方法详解
- 推荐四十多条纯干货 Java 代码优化建议
- MyBatis 源码解读-执行SQL
- css3中的 @Keyframes
- python-函数与变量的定义-标识符的命名规范
- modem (1)---手机主叫的信道流程与Modem Log简单分析
- [Android] 混音线程MixerThread
- nbu备份win平台oracle,NBU备份ORACLE错
- 最简单的dubbo教程-快速入门
- 黑马程序员全套Java教程_Java基础教程_API(十四)
- 手把手教您怎么编写第一个单片机程序
- Matlab:实现自定义圆孔阵列远场衍射仿真
- 推荐两款好用的视频压缩工具(在保证画质的情况下最大限度地压制)
- 周云蓬献唱《杜甫三章》实证“把古人唱成亲人”
- 凡事预则立不预则废---20180112
- 苏宁小BIU诞生日 机器人员工正式“入职”
- Flink-DataStream快速上手