首页 > 编程语言 >关于c++输入输出缓冲区,和IO加速流的一些理解

关于c++输入输出缓冲区,和IO加速流的一些理解

时间:2024-04-21 22:45:00浏览次数:29  
标签:cout 输入输出 cin c++ IO 缓冲区

首先,让我们来介绍一下这个函数

ios::sync_with_stdio();

这个函数在缺省状态下默认为true,即开启,这个函数的作用是同步c和c++的缓冲区

这个操作是c++为了兼容c而做出的保守决定,即将c和c++的缓冲区合并为一个,但是这样会带来性能上的开销

为什么呢?因为这个兼容缓冲区先执行c的输入输出操作再执行c++的输入输出操作

题主猜测是因为判断输入输出是来源于c/c++的操作造成了开销

当ios::sync_with_stdio(false); 接收false时,c与c++的缓冲区分离为两个独立的区

c的IO函数会将数据存入c的缓冲区

c++的IO函数会将数据存入c++的缓冲区

但是因为c和c++清空缓冲区的条件不一样,所以在分离缓冲区情况下混用c和c++的IO流会出现输出顺序不一样的情况(所以关闭兼容之后最好用纯c++,不要用任何c库函数中关于IO的函数,尤其注意getchar,应该换成cin.get())

在这里引用一篇博客作为例子

https://blog.csdn.net/xiunai78/article/details/2584621?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171370365216800225541332%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171370365216800225541332&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-2584621-null-null.142^v100^control&utm_term=cout%20printf%E6%B7%B7%E7%94%A8&spm=1018.2226.3001.4187

再就是cin.tie(0); cout.tie(0);这两个函数

首先我们要了解一下一个特性

就是cin和cout是绑定的

在cin读取数据时,cout会连带刷新输出缓存区

这样就带来了性能开销

cin.tie(0); cout.tie(0);这两个函数就是让cin与cout解绑

使得cin与cout的效率更近一步

再就是endl和'\n'这两个的区别

其实 endl='\n'+flush 也就是说endl在实现换行功能的同时刷新了缓冲区

频繁刷新缓冲区这个操作在ACM等算法竞赛中不仅没有必要而且还带来了不小的性能开支

所以再将endl换成'\n'可以使得cin cout的效率几乎与scanf printf无异而且在大数据输入输出时还可能反超

再就是cin输入时的一些理解

cin不能读入空白符,而且cin在缓冲区中读入数据时会自动忽略前导空白符,直至遇到合法数据

但是cin成功读入后,缓冲区剩余的空白符会保留,cin不做处理,

比如int a; cin>>a后

再getline时就会读入缓冲区中遗留的\n

标签:cout,输入输出,cin,c++,IO,缓冲区
From: https://www.cnblogs.com/1DeomS2/p/18149665

相关文章

  • 小程序animation使用
    想实现一个item左滑展示编辑和删除按钮的功能,涉及到元素移动,因此使用animation属性来实现了解animation下面这段代码设置了一个动画的各种属性(持续1000ms;匀速到加速再减速;立即开始执行;元素变换基点,此处是平移,不起作用),然后设置动画效果向左平移100元素,最后,调用export()方法......
  • WPF relativesource,self,FindAncestor,AncestorType,AncestorLevel,PreviousData,Tem
    <Windowx:Class="WpfApp68.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com......
  • github的Contributions找不到自己:设置git commit邮箱与用户名
    最近发现公司的开源项目github都找不到我的名字公司前端库TDesign无论是vue还是react,都找不到我:https://github.com/Tencent/tdesign-vue/graphs/contributors部门的前端库vue2vue3版本照样没有自己 https://github.com/TencentBlueKing/bkui-vue3 为什么Github没有记录你......
  • cookie session token
    【一】浏览器保存状态【1】http请求的特点#1.无状态每一次的http请求,浏览器都不会保存当时的状态,如用户的登录#2.无连接每个http请求都是一次独立的交互,无连接也可以称为短链接,因为只有发送请求以及得到响应的那么一刻时间服务端和浏览器会有连接,他的连接生命周期非常短暂......
  • P5897 [IOI2013] wombats
    MyBlogsP5897[IOI2013]wombats有点恐怖。首先\(R,C\)很不平衡,考虑用一棵竖着的线段树维护较大的\(R\)维,每个节点上需要存的是\(C\timesC\)的数组\(d\),\(d_{i,j}\)表示该节点的最上面一行第\(i\)个到最下面一行第\(j\)个的最短路。因为已经处理好了左右儿子内......
  • JNDI-Injection-Exploit 下载/解决相关问题
    环境:Centos8jdk1.8maven3.8.81、jdk1.8安装jdk官网:https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html我选择的版本是:jdk-8u391-linux-x64.tar.gzcd/usr/local/tar-xvfjdk-8u391-linux-x64.tar.gz设置环境,在/etc/p......
  • web server apache tomcat11-12-SSL/TLS Configuration
    前言整理这个官方翻译的系列,原因是网上大部分的tomcat版本比较旧,此版本为v11最新的版本。开源项目从零手写实现tomcatminicat别称【嗅虎】心有猛虎,轻嗅蔷薇。系列文章webserverapachetomcat11-01-官方文档入门介绍webserverapachetomcat11-02-setup启动web......
  • 寻找是否存在从source到destination的路径
    TheFindifPathExistsinGraphprobleminvolvesdeterminingwhetherthereisapathbetweentwogivennodes(sourceanddestination)inanundirectedgraph.Thegraphisrepresentedbynnodesandalistofedges,whereeachedgespecifiesaconnection......
  • Crest Factor Reduction(CFR)
    目录1.introduction:WhatisCFR?2.WhyweneedCFRinOFDMsystemForOFDMsystem3.CFRMethodsclippingandfilteringPeakwindowingpeakcancellation1.introduction:WhatisCFR?谈及CFR(峰均比抑制)之前,首先需要搞清楚峰均比的定义以及为何需要抑制过高的峰均比。......
  • PT Application Inspector 4.5 (Linux) - 静态、动态和交互式应用程序安全测试
    PTApplicationInspector4.5(Linux)-静态、动态和交互式应用程序安全测试唯一一款提供高质量分析和便捷工具以自动确认漏洞的源代码分析器请访问原文链接:PTApplicationInspector4.5(Linux)-静态、动态和交互式应用程序安全测试,查看最新版。原创作品,转载请保留出处。......