当前位置: 首页 > news >正文

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手动刷新缓冲区;

相关文章:

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

目录 背景导入 问题 1.1ios::sync_with_stdio(false) 1.2为什么要解除C/C IO流同步? 1.3使用场景 2.1cin和cout的绑定关系 2.2为什么要解除绑定关系? 2.3注意事项 背景导入 大家可以先看一下这段背景知识;后面我会谈谈自己的理解; 1.在C中&#xff0c;标准输⼊输出流…...

redisson-spring-data与Spring-Data-Redis的版本关系问题

redisson-spring-boot-starter https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter https://github.com/redisson/redisson/tree/master/redisson-spring-data#spring-data-redis-integration 将 Redisson 与 Spring Boot 库集成。依赖于Spring…...

Puppeteer代理认证的最佳实践和示例

在现代网络环境中&#xff0c;代理服务器的使用越来越普遍&#xff0c;尤其是在数据抓取、网页自动化测试和网络监控等领域。Puppeteer作为一个流行的Node库&#xff0c;它提供了高级的API来控制Chrome或Chromium浏览器。在某些情况下&#xff0c;我们需要通过代理服务器来执行…...

js 字符串 只显示数字

1. 使用正则表达式的match方法 原理&#xff1a;正则表达式\d用于匹配一个或多个数字。match方法会在字符串中查找与正则表达式匹配的部分&#xff0c;并返回一个包含所有匹配结果的数组。示例代码&#xff1a; let str "abc123def456"; let numbers str.match(/…...

STM32标准库-FLASH

FLASH模仿EEPROM STM32本身没有自带EEPROM&#xff0c;但是自带了FLASH存储器。 STM32F103ZET6自带 1M字节的FLASH空间&#xff0c;和 128K64K的SRAM空间。 STM32F4 的 SPI 功能很强大&#xff0c;SPI 时钟最高可以到 37.5Mhz&#xff0c;支持 DMA&#xff0c;可以配置为 SPI协…...

PowerShell:查找并关闭打开的文件

Get-SmbOpenFile 打开 Windows PowerShell 并运行 Get-SmbOpenFile | Format-List 若要仅显示特定文件共享的连接&#xff0c;请使用 Where-Object 运行 Get-SmbOpenFile。 Get-SmbOpenFile | Where-Object Path -eq "C:\Data\" | Format-List Get-SmbSession 显…...

【AI系统】昇腾异构计算架构 CANN

昇腾异构计算架构 CANN 本文将介绍昇腾 AI 异构计算架构 CANN&#xff08;Compute Architecture for Neural Networks&#xff09;&#xff0c;这是一套为高性能神经网络计算需求专门设计和优化的架构。CANN 包括硬件层面的达芬奇架构和软件层面的全栈支持&#xff0c;旨在提供…...

STM32 HAL库开发学习3.STM32启动浅析

STM32 HAL库开发学习3.STM32启动浅析 一、STM32启动模式&#xff08;也称自举模式&#xff09;1. MSP与PC指针赋值2. F1系列的启动模式&#xff1a;3. F4系列启动模式4. F7系列启动模式5. H7系列启动模式 二、STM32启动过程1. MSP 栈顶地址2. PC值3. Reset_Handler4. 启动文件内…...

FakeLocation 1.3.5 BETA 提示校园跑漏洞修复解决

任务一 作者对此又进行了更新&#xff0c;在本次更新中&#xff0c;我们依旧使用hookvip进行破解 本次的更新&#xff0c;使得包名强制写入更加严重&#xff0c;之前靠一些方法已经无法阻止appconfigs.xml的文件的修改&#xff0c;而且使得验证加强&#xff0c;和云端加强&…...

Figma入门-约束与对齐

Figma入门-约束与对齐 前言 在之前的工作中&#xff0c;大家的原型图都是使用 Axure 制作的&#xff0c;印象中 Figma 一直是个专业设计软件。 最近&#xff0c;很多产品朋友告诉我&#xff0c;很多原型图都开始用Figma制作了&#xff0c;并且很多组件都是内置的&#xff0c…...

腾讯元宝深度搜索AI多线程批量生成TXT原创文章软件

腾讯元宝深度搜索AI多线程批量生成TXT原创文章软件说明&#xff1a; 腾讯元宝深度搜索AI&#xff1a;能够理解用户意图&#xff0c;对搜索结果进行提炼和总结&#xff0c;直接提供用户所需的答案或信息摘要&#xff0c;从而提升用户体验。 腾讯元宝深度搜索AI&#xff1a;通过…...

Git操作学习1

一、一些Linux相关指令 在当前目录下&#xff0c;创建文件并写入内容&#xff1a;echo "这是第一个文件">file1.txt 查看文件的内容&#xff1a; cat file1.txt 会显示&#xff1a;这是第一个文件 修改文件名&#xff1a;mv file.txt file4.txt 把file.txt修改…...

【计算机网络】细说IP

文章目录 概述IP地址的组成IP地址的分类IP地址的作用 分类一、A类IP地址二、B类IP地址三、C类IP地址四、D类IP地址五、E类IP地址 协议报文子网掩码一、定义与功能二、表示方法三、子网掩码与IP地址的关系四、子网掩码的设置与配置五、实例说明 IPv6一、定义与背景二、地址格式与…...

树与图深度优先遍历——acwing

题目一&#xff1a;树的重心 846. 树的重心 - AcWing题库 分析 采用暴力枚举&#xff0c;试探每个点&#xff0c;除去之后&#xff0c;连通分量最大值是多少&#xff0c; 各个点的最大值找最小的 因为可以通过 dfs 来得到 根u以下点数&#xff0c;以及可以求各分树的点数&am…...

vue3.0 根据富文本html页面生成压缩包(含视频在线地址、图片在线地址、前端截图、前端文档)

vue3.0生成压缩包&#xff08;含在线地址、前端截图、前端文档&#xff09; 需求描述效果开始下载插件包基本代码构造 点击下载按钮1.截图content元素&#xff0c;并转化为pdfcanvas putImageData、getImageDatagetImageData 获取指定矩形区域的像素信息putImageData 将这些数据…...

WPF+LibVLC开发播放器-LibVLC在C#中的使用

LibVLC在C#中的使用 安装包Nuget使用控件使用播放器初始化加载视频文件 视频教程&#xff1a; 使用WPFLibVLC快速开发一个播放器 安装包Nuget 安装下面两个包,必须安装两个 一个是相关框架对应的包&#xff0c;Winform就安装LibVLCSharp.Winform;WPF就安装LibVLCSharp.WPF&am…...

消息中间件-Kafka1-实现原理

消息中间件-Kafka 一、kafka简介 1、概念 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统&#xff0c;它的最大的特性就是可以…...

2023年华数杯数学建模B题不透明制品最优配色方案设计解题全过程文档及程序

2023年华数杯全国大学生数学建模 B题 不透明制品最优配色方案设计 原题再现&#xff1a; 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此&#xff0c;不透明制品的配色对其外观美观度和市场竞争力起着重要作用。然而&#xff0c;传统的人工配色存在一定的局限性…...

Mysql事务常见面试题 -- 事务的特性 ,并发事务问题 , undo_log和redo_log , 分布式事务

一. 事务的特性 ACID 原子性 --> 事务操作被视为一个整体 , 要么全部成功 , 要么全部失败一致性 --> 事务操作前后数据的变化是一致的隔离性 --> 事务的执行不受其他事务的影响持久性 --> 事务执行完毕会对数据永久保存 比如我们在转账的过程中 , A给B转账1000元…...

【数据库系列】Spring Boot如何配置Flyway的回调函数

Flyway 提供了回调机制&#xff0c;使您能够在特定的数据库迁移事件发生时执行自定义逻辑。通过实现 Flyway 的回调接口&#xff0c;可以在迁移前后执行操作&#xff0c;如记录日志、执行额外的 SQL 语句等。 1. 创建自定义回调类 要配置 Flyway 的回调函数&#xff0c;需要创…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...