C++加快IO操作的方法

  1. 如果C++代模块中没有使用C的输入或输出函数,而是只用到了C++的输入输出函数,则可以使用std::ios::sync_with_stdio(false)来关闭同步。这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑到了一起。解绑后,速度会有质的提升。实际上,如果未关闭同步,C++的流本身并没有缓冲,每个C++流的操作都是直接与C的流缓冲进行交互。这种情况下,C++的流操作和C的流操作就可以混用,而不会发生问题。此外,未关闭同步的C++流也是线程安全的,多个线程的单个字符输出可能会发生交错,但不会发生数据竞争。如果关闭了同步,则每个C++流操作都有自己的缓冲区,这在某些情况下会极大地加速流操作,但是就不是线程安全的了,且此时不能与C的IO函数混用
  2. 此外,std::cinstd::cout也有绑定,导致每次std::cout执行后并在执行std::cin时都会刷新输出缓冲区,也就是说每次使用std::cin进行数据输入时,都会调用一次std::cout.flush()函数,对缓冲区进行刷新。解除同步能够进一步加快IO速度:std::cin.tie()。如果不传入形参,则函数只会返回与std::cin进行同步绑定的std::ostream对象的指针。如果形参传入一个std::ostream类型的指针,则表示将std::cin与此对象进行同步绑定,并返回前一个与std::cin进行绑定的std::ostream类型的指针。如果形参传入nullptr,那就表示解绑的意思啦。注意,tie()函数不止用于std::cin对象,对于任何C++的std::istream对象(如std::ifstream对象)都有对应的tie()成员函数,都能加快读写速度;
  3. 使用tie()解除绑定后,一定要注意在使用std::ostream输出数据后并在使用std::istream输入数据前要主动flush缓冲区的内容,不然容易出错;
  4. 注意,执行std::ios::sync_with_stdio(false)后,stdio中的printfscanf之间的同步也会被取消,不过多多测试;
  5. 注意,使用了上述两个优化后,就不能混合使用scanf, getchar, gets, fgets, fscanf了。注意,混合使用是指对同一个文件混合使用,对不同文件访问是没问题的;
  6. 由上可知,std::ios::sync_with_stdio(false)关闭了与C流的同步,启用了C++自己的缓冲区,能够加快输出操作,而tie(nullptr)是解绑C++的输入输出流,从而使得执行输入的时候,不会主动刷新缓冲区,能够加快输入操作;
  7. 有人测试得出,使用fread()fwrite()速度可能会更快,可以看下面的链接。

详细测试不同IO函数的速度
探寻C++最快的读取文件的方案
std::ios::sync_with_stdio



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值