cin/cout的性能优化和缓冲区同步问题

目录

背景导入

问题

1.1ios::sync_with_stdio(false)

1.2为什么要解除C++/C IO流同步?

1.3使用场景

2.1cin和cout的绑定关系

2.2为什么要解除绑定关系?

2.3注意事项


背景导入

大家可以先看一下这段背景知识;后面我会谈谈自己的理解;

1.在C++中,标准输⼊输出流如 cin 和 中,标准输⼊输出函数如 cout 是由C++的标准库提供的;⽽在C语⾔ scanf 和 printf 是由C标准库提供的。由于C++是从C 发展⽽来的语⾔,C++标准库的输⼊输出流系统需要与C标准库的输⼊输出系统兼容,以 确保在同⼀程序中能够混合使⽤C和C++的输⼊输出函数。为了实现这种兼容性,C++ 标准库默认会将 cin 、 cout 等C++流对象与stdin 、 stdout 等C标准库的流对象同步在⼀起。这种同步操作意味着每次使⽤cin 或 cout 时,都会⾃动刷新C标准库的缓冲区,以确保C++和C的I/O是⼀致的;

2.在默认情况下, cin和cout 之间存在⼀种绑定关系。这种绑定意味着,每当从cin 读取数据时,任何之前通过cout 输出的内容都会被强制刷新到屏幕上。这个机 制保证了输出内容能够⽴即显⽰给⽤⼾,这对于交互式程序⾮常有⽤。但是,这种绑定也 可能导致性能问题,特别是在需要频繁读取⼤量数据的情况下。这是因为每次从 cin 读 取数据都会触发⼀次输出缓冲区的刷新,即使实际上没有进⾏输出操作,也会浪费时间。

问题

1.ios::sync_with_stdio(true/false)是什么?
2.cin/cout的tie(绑定关系)是什么?
3.为什么要解除cin/cout的绑定关系?
4.为什么要取消C++和C的缓冲区同步?

1.1ios::sync_with_stdio(false)

我们都知道C++是从C语言发展过来的,我们还知道在.cpp文件中是可以同时使用C++和C的IO流的,也就是cin/scanf,cout/printf是可以混合着用的;二者的IO是兼容的;都是共享的同一块缓冲区;

而于此相关的表示同步关系开关的代码语句就是"ios::sync_with_stdio",我们平时使用的cin其实是istream的一个对象,cout是ostream的一个对象;
而ios就是iostream的一个基类;sync的意思是"同步",with_stdio就很明显了,就是与C的IO流同步;说到这里可能还不够清楚,没关系,下面会讲到他的真正作用;

ios::sync_with_stdio的真正作用就是在使用另外一方的IO流时刷新缓冲区;

举个例子:(这一块由于编译器的优化,无法使用代码验证)

我们都知道缓冲区是只有等到满了或者遇到回车或程序结束的时候才会自动刷新的,缓冲区刷新的表现就是将其内容打印到屏幕上;

 如果我没有打开IO同步的话,那我在从C++的IO流切换到C的IO流的时候是不会强制刷新缓冲区的;

如图:我先使用cout了,此时在执行scanf之前缓冲区里是有hello world一个字符串的;由于我没有打开同步,所以我在执行scanf语句的时候屏幕上是不会打印hello world的;因为缓冲区没有刷新嘛;

如果我打开了IO同步,那么在执行scanf的时候,就会强制的把缓冲区刷新一遍,因为我要使用C的IO流了,C++在缓冲区中输入的内容要清理掉;这个时候的运行结果就会先显示hello world,然后让你输入变量X;

由于这块编译器做了优化,所以是否解除同步,运行结果都一样,不方便验证;

1.2为什么要解除C++/C IO流同步?

正是因为每次切换IO,都要刷新一下缓冲区,如果数据量很大,程序员又经常性的切换IO,即使缓冲区没有任何内容,依旧会自动的刷新缓冲区,这就很浪费时间了;

如果我们解除了同步关系;这个缓冲区就暂时性的归属于一方;那么我们就最好不要交叉使用了;否则会造成一些不必要的麻烦;

1.3使用场景

竞赛编程:在处理⼤量输⼊输出的竞赛环境中,这种优化⾮常常⻅,因为它可以显著减少I/O操作 的时间。

• 只使⽤C++I/O:如果你的程序只使⽤ cin 、 cout 进⾏I/O,⽽不涉及C的I/O函数,那么可 以安全地使⽤这项优化来提⾼性能。

2.1cin和cout的绑定关系

前面我们讲了C++和C的IO切换会强制刷新缓冲区,这是C++的IO和C的IO的同步关系;而cin和cout也有同步关系,由于他们都是C++的IO,所以更准确的叫法是绑定;

他们之间的关系同样是作用在缓冲区上;

cin.tie(0) 是C++中⽤于解除标准输⼊流 在C++中, cin 是 cin 与标准输出流 istream 类型的流对象, cout 之间默认绑定的⼀个⽅法。 cout 是 ostream 类型的流对象,分别⽤于标准输 ⼊和标准输出。

 在默认情况下, cin 和 时,任何之前通过 cout 之间存在⼀种绑定关系。这种绑定意味着,每当从 cin 读取数据 cout 输出的内容都会被强制刷新到屏幕上。这个机制保证了输出内容能够⽴即显 ⽰给⽤⼾,这对于交互式程序⾮常有⽤。但是,这种绑定也可能导致性能问题,特别是在需要频繁读 取⼤量数据的情况下。这是因为每次从 cin 读取数据都会触发⼀次输出缓冲区的刷新,即使实际上 没有进⾏输出操作,也会浪费时间

 这里我简单举个例子

 默认状态下cin和cout是绑定了的,我使用cout,缓冲区中存有hello world,没有回车,缓冲区不会自动刷新.运行结果会先打印hello world然后在让我们输入x的值;

如果我们没有绑定cin和cout,那执行cin之前就不会强制刷新缓冲区,运行结果就应该是先让你输入X,输入完回车后再打印hello world; 

2.2为什么要解除绑定关系?

这里与上面的同步解释是一样的,如果缓冲区没有内容遇到cin,就会强制刷新缓冲区,有时完全没有必要,为了提高效率,通常采用解除绑定的方法;

如果是非交互式的程序,那就可以不解除;因为交互式程序需要给用户提示等...

如果是在ACM等竞赛中,那么往往都是需要解除绑定的;

2.3注意事项

如果我们解除了cin/cout的绑定关系,cin是不会强制刷新缓冲区的,有时候我们在输入数据之前,需要前面的提示;这个时候我们就需要使用cout.flush或者cout<<endl手动刷新缓冲区;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/61525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

node.js基础学习-url模块-url地址处理(二)

前言 前面我们创建了一个HTTP服务器&#xff0c;如果只是简单的http://localhost:3000/about这种链接我们是可以处理的&#xff0c;但是实际运用中一般链接都会带参数&#xff0c;这样的话如果我们只是简单的判断链接来分配数据&#xff0c;就会报404找不到链接。为了解决这个问…

基于springboot中小型制造企业质量管理系统源码和论文

信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古以来的…

服务器密码错误被锁定怎么解决?

当服务器密码错误多次导致账号被锁定时&#xff0c;解决方法需要根据服务器的操作系统&#xff08;如 Linux 或 Windows &#xff09;和具体服务器环境来处理。以下是常见的解决办法&#xff1a; 一、Linux 服务器被锁定的解决方法 1. 使用其他用户账号登录 如果有其他未被…

Java基础——(四)继承

1. 类、超类和子类 在Java中&#xff0c;通过关键字extends表示继承。extends表明正在构造的新类派生与一个已存在的类&#xff0c;已存在的类称为超类&#xff08;superclass&#xff09;、基类&#xff08;base class&#xff09;或父类&#xff08;parent class&#xff09…

Python语法基础(四)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 高阶函数之map 高阶函数就是说&#xff0c;A函数作为B函数的参数&#xff0c;B函数就是高阶函数 map&#xff1a;映射 map(func,iterable) 这个是map的基本语法&#xff0c;…

《datawhale2411组队学习 模型压缩技术7:NNI剪枝》

文章目录 一、NNI简介二、 NNI剪枝快速入门2.1 加载并训练模型2.2 模型剪枝2.3 模型加速&#xff08;剪枝永久化&#xff09;2.4 微调压缩模型2.5 Slim Pruner测试 三、 使用NNI3.0进行Bert压缩&#xff08;剪枝、蒸馏)3.1 数据预处理3.2 训练模型3.3 设置模型蒸馏函数3.4 修剪…

day22:lamp项目部署

一&#xff0c;lamp概述 lamp概述 LAMP 是一组开源软件的缩写&#xff0c;用于搭建动态网站或Web应用程序的基础环境。LAMP 代表了四个主要的组成部分&#xff1a; Linux&#xff1a;操作系统&#xff0c;LAMP 环境的基础。通常使用的是 Linux 发行版&#xff0c;如 CentOS、…

【提高篇】3.6 GPIO(六,寄存器介绍,下)

目录 2.3 输出速度寄存器OSPEEDR(GPIOx_OSPEEDR) (x = A..I) 2.4 上拉/下拉寄存器 (GPIOx_PUPDR) (x = A..I) 2.5 输入数据寄存器(IDR) 2.6 输出数据寄存器(ODR) 2.7 置位/复位寄存器(BSRR) 2.8 BSRR与ODR寄存器的区别 2.3 输出速度寄存器OSPEEDR(GPIOx_OSPEEDR) (…

【IMF靶场渗透】

文章目录 一、基础信息 二、信息收集 三、flag1 四、flag2 五、flag3 六、flag4 七、flag5 八、flag6 一、基础信息 Kali IP&#xff1a;192.168.20.146 靶机IP&#xff1a;192.168.20.147 二、信息收集 Nmap -sP 192.168.20.0/24 Arp-scan -l nmap -sS -sV -p- -…

记一次腾讯云海外服务器http能正常访问https访问拒绝问题处理过程

最近双十一, 购了一台腾讯云的海外服务器&#xff0c; 开通后就是一堆的服务器软件安装数据上传和配置&#xff0c;没想到&#xff0c;等待配置完成后才发现https无法正常访问&#xff0c;于是开启了自查。 1. 检查nginx软件的ssl配置 nginx http https配置参考 server {l…

hdlbits系列verilog解答(mt2015_muxdff)-90

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本节要实现的电路来自于ECE253 2015中期测试问题5。要实现以下如图所示的时序电路中复用器及D触发器子模块。 模块声明 module top_module ( input clk, input L, input r_in, input q_in, output reg Q); 思路…

Android 图形系统之七:SurfaceFlinger

一. 引言 什么是 SurfaceFlinger&#xff1f;SurfaceFlinger 的核心作用和地位&#xff1f;为什么需要了解 SurfaceFlinger&#xff1f; 二. SurfaceFlinger 的基本概念 Surface 和 SurfaceFlinger 的关系SurfaceFlinger 与图形渲染&#xff08;OpenGL ES 和 Vulkan&#xf…

基于Java Springboot宠物服务中心微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

算法妙妙屋-------1.递归的深邃回响:全排列的奇妙组合

全排列的简要总结 全排列&#xff08;Permutation&#xff09;是数学中一个经典的问题&#xff0c;指的是从一组元素中&#xff0c;将所有元素按任意顺序排列形成的所有可能序列。 特点 输入条件&#xff1a; 给定一组互异的元素&#xff08;通常为数组或字符串&#xff09;。…

内网穿透步骤

步骤 第一次需要验证token window和linux的方法不同。 然后 启动 cpolar 服务&#xff1a; 在命令窗口中输入 cpolar.exe htttp 8080&#xff0c;启动内网穿透服务。确保命令窗口保持开启状态&#xff0c;以维持穿透效果。 cpolar.exe hhttp 8080 成功后 注意事项 命令窗口…

房屋结构安全监测系统守护房屋安全卫士

一、系统背景 随着时间的流逝&#xff0c;建筑物的主体结构、设备设施等会因为自然老化、材料疲劳、使用环境的变化以及维护不当等各种因素的影响&#xff0c;逐渐出现性能下降甚至安全隐患。因此&#xff0c;进行房屋安全监测显得尤为重要。房屋结构安全是指建筑物的结构体系在…

直击高频编程考点:聚焦新版综合编程能力考查汇总

目录 一、业务性编程和广度能力考查 &#xff08;一&#xff09;基本定义 &#xff08;二&#xff09;必要性分析 二、高频考查样题&#xff08;编程扩展问法&#xff09; 考题1: 用java 代码实现一个死锁用例&#xff0c;说说怎么解决死锁问题&#xff1f;&#xff08;高…

架构05-架构安全性

零、文章目录 架构05-架构安全性 1、软件架构安全的重要性 **系统安全&#xff1a;**不仅包括防御黑客攻击&#xff0c;还包括安全备份与恢复、安全审计、防治病毒等。**关注重点&#xff1a;**认证、授权、凭证、保密、传输安全、验证。 2、认证&#xff08;Authenticatio…

4399大数据面试题及参考答案(数据分析和数据开发)

对数据分析的理解 数据分析是一个从数据中提取有价值信息以支持决策的过程。它涵盖了数据收集、清洗、转换、建模和可视化等多个环节。 首先&#xff0c;数据收集是基础。这包括从各种数据源获取数据&#xff0c;例如数据库、文件系统、网络接口等。这些数据源可以是结构化的数…

封装类与封装函数

目录结构 src/ ├── utils/ │ ├── test.js │ ├── Calculator.js ├── views/ │ ├── Home.vue ├── App.vue 共同点&#xff1a;模块导出与模块引入 封装函数 场景 简单、轻量级和性能敏感的场景&#xff0c;适合快速开发和维护。 优 可维护性&…