目录&索引

  • 一、前言
    • 题目
  • 二、ios::sync_with_stdio(false)
  • 三、cin.tie(nullptr)
  • 四、小结

一、前言

之前写题遇到大数据量(cin、cout 数据量级达到 1e5、1e6 ),因为考虑 IO 性能报错 TLE,故选择 scanf、printf 替代 cin、cout,以解决问题。一直以来没有深入研究其中原因,只知关键词——同步,虽是本质但差之千里,今究其因,记录本文。

针对上述场景无法 AC,起因是打 LC 周赛发现 top 选手用的下述代码:

// 已做相关改进,包括 cin.tie(0) 被替换为 cin.tie(nullptr),删掉不必要的 cout.tie(0),因不涉及本文主题故不详细展开
using namespace std;
ios::sync_with_stdio(false);
cin.tie(nullptr);

题目

(以本题最短路,报错 TLE 为例——附题解传送)


二、ios::sync_with_stdio(false)

在调用 ios::sync_with_stdio(false) 后,cout 与 stdout 不再共享同一块缓冲区,它们分别管理自己的缓冲区。简述,函数作用为设置标准 C++ 流是否与标准 C 流在每次输入/输出操作后同步(官方文档,见下图)。

正是因为这种同步,所以 cin、cout 比 scanf、printf 速度要慢,如果我们在使用 cin、cout 输入输出前加一句 ios::sync_with_stdio(false),即取消缓冲区同步,可节省时间,效率与 scanf、printf 相差无几。

具体功能,需要注意以下几点:

1、实践中,这表示同步的 C++ 流为无缓冲,而每次 C++ 流上的 I/O 都立即应用到对应 C 流的缓冲区。这使得能自由地混合 C++ 与 C I/O 。
2、同步的 C++ 流保证为线程安全(从多个线程输出的单独字符可能交错,但无数据竞争)。
3、若关闭同步,则允许 C++ 标准流独立地缓冲其 I/O ,可认为这在某些情况下更快。
4、所有八个标准 C++ 流默认与其相应的 C 流同步。
5、若在标准流上已出现 I/O 后调用此函数,则行为是实现定义的:有的实现无效果,有的实现销毁读取缓冲区。


三、cin.tie(nullptr)

tie 是一个函数,将两个 stream 绑定,空指针的话返回当前输出流指针(官方文档,见下图)。

函数介绍(注意返回值):

std::basic_ostream<CharT,Traits>* tie() const; // 返回当前联系流。若无联系流,则返回空指针。
std::basic_ostream<CharT,Traits>* tie( std::basic_ostream<CharT,Traits>* str ); // 设置当前联系流为 str ,返回操作前的联系流。若无联系流,则返回空指针。

cin 默认是与 cout 绑定,所以每次 cin 操作的时候都在联系流(即输出流)调用 flush(),这样增加了 IO 负担,通过 cin.tie(nullptr) 来解除 cin 和 cout 之间的绑定,进一步加快执行效率。同时,解除绑定带来的效果,详述如下:

cin 默认绑定了 cout 来同步在控制台输出。“绑定”的效果,每当被“绑定”的对象有出入或输出操作,就会即时刷新(本质,在一定刷新频率下刷新)“绑定”的对象的缓冲区,以达到即时回显的效果。cout 没有默认绑定其他输出,所以 cout.tie() 获取到空指针。

代码验证:

#include <iostream>
using namespace std;int main() {cout << "cin.tie(): " << cin.tie() << endl;cout << "cin.tie(nullptr): " << cin.tie(nullptr) << endl; // 返回操作前的联系流cout << "cin.tie(): " << cin.tie() << endl;cout << endl;cout << "cerr.tie(): " << cerr.tie() << endl;cout << "cerr.tie(nullptr): " << cerr.tie(nullptr) << endl; // 返回操作前的联系流cout << "cin.tie(): " << cin.tie() << endl;cout << endl;cout << "clog.tie(): " << clog.tie() << endl;cout << "cout.tie(): " << cout.tie() << endl;return 0;
}

输出:

cin.tie(): 0x55dea3046140
cin.tie(nullptr): 0x55dea3046140
cin.tie(): 0cerr.tie(): 0x55dea3046140
cerr.tie(nullptr): 0x55dea3046140
cin.tie(): 0clog.tie(): 0
cout.tie(): 0

四、小结

对文章内容有不解,请随时留言。


【C++】ios::sync_with_stdio(false) 与 cin.tie(nullptr) 加速 IO相关推荐

  1. 解析 static auto x = []() { std::ios::sync_with_stdio(false);std::cin.tie(nullptr);return 0;}()

    前言 这两天在LeetCode上刷题的时候看见有好几个速度排名第一的代码中都有一段类似的代码,如下: static const auto io_sync_off = []() {// turn off ...

  2. 关于ios::sync_with_stdio(false);和 cin.tie(0)加速c++输入输出流

    原文地址:http://www.hankcs.com/program/cpp/cin-tie-with-sync_with_stdio-acceleration-input-and-output.ht ...

  3. leetcode练习——数组篇(1)(std::ios::sync_with_stdio(false);std::cin.tie(nullptr);)

    题号1. 两数之和: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复 ...

  4. C++输入输出流加速器,关闭同步流,ios::sync_with_stdio(false)和 cin.tie(0)

    leetcode练习时,总会发现运行时间短的代码都会有类似: static int x=[](){std::ios::sync_with_stdio(false);cin.tie(NULL);retu ...

  5. cin.tie(NULL)--加速

    我是怎么在不知道这一对函数的情况下活到今天的,以前碰到cin TLE的时候总是傻乎乎地改成scanf,甚至还相信过C++在IO方面效率低下的鬼话,殊不知这只是C++为了兼容C而采取的保守措施. tie ...

  6. ios::sync_with_stdio(false)的作用

    默认的时候,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱, 所以一般会用ios::sync_with_stdio(false)来取消cin与stdin的同步,从 ...

  7. 拾趣——ios::sync_with_stdio(false)详解(提高代码运算速度)

    本篇文章核心意思:在编程时cin(cout)比scanf(printf)慢,在代码里加上ios::sync_with_stdio(false) 这个语句后,cin(cout)速度就会变得和scanf( ...

  8. std::ios::sync_with_stdio(false)的运用

    c++中cin,cout效率比较低,是因为先把要输出的东西存入缓冲区与C语言中的stdio同步后,再输出,导致效率降低,而这段语句的作用是取消缓冲区同步,直接使用,由此可节省时间,使效率与scanf与 ...

  9. 关于std::ios::sync_with_stdio(false)

    std::ios::sync_with_stdio(false); 很多C++的初学者可能会被这个问题困扰,经常出现程序无故超时,最终发现问题处在cin和cout上,(甚至有些老oier也会被这个问题 ...

最新文章

  1. 求Fibonacci数列的前20项
  2. 谷歌TPU训练BERT只要23秒,华为AI芯片达国际领先水平,MLPerf v0.7出炉
  3. 布道微服务_05RPC远程服务调用的实现
  4. 【物联网】 Yeelink开发平台注册
  5. using filesort和using temporary
  6. am335x mysql_Ubuntu下编译ARM平台QtEmbedded的MySQL和MySQL插件
  7. jsp el 表达式_JSP表达式语言– JSP EL示例教程
  8. OverflowError: Python int too large to convert to C long
  9. java项目tkmybatis整合_springboot集成tk mybatis
  10. unity算法-斜抛运动(变种)
  11. ElasticSearch——路由(_routing)机制
  12. navicat 使用ssh连接腾讯云主机mysql数据库(保姆级教程)
  13. Photoshop-液化工具对人物的应用
  14. C++的继承(一): 让蟋蟀继承蚱蜢
  15. Python神笔马良案例集简介
  16. 【相似的生活,不可思议】
  17. 源生JS 之对象key值为数字时的取值及修改key值方法
  18. kotlin 两目运算符
  19. 【Unity3D】3D游戏学习
  20. 机器人技术想要取得快速发展,主要面临哪些挑战?

热门文章

  1. ShapeFile预览神器QuickLook
  2. 搜索引擎网站收录提交入口
  3. 浅析PHS无线市话市场、技术发展前景及运营思路
  4. 王道数据结构2021年课件PPT分享
  5. 四则运算java_小学生四则运算JAVA
  6. 常用类:Java比较器
  7. Python3中打开文件的方式(With open)
  8. python长度单位转化_长度单位的换算教学反思
  9. 新浪邮件互通解决办法
  10. openssl java des_OPENSSL库的使用-DES篇