当前位置: 首页 > 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;需要创…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...