c++缓冲区同步原理与std::ios::sync_with_stdio作用

缓冲区同步机制


为什么需要缓冲区同步

c++是基于c语言扩展语言,本质上它继承了c语言许多特性,同时也继承了C语言特性,在c语言中stdio为输入输出缓冲区,stdin是输入缓冲区,stdout是输出缓冲区,C++不与C语言使用同一个缓冲区,这就出现了一个问题,当使用printfcout输出语句时因为它俩不使用同一个缓冲区就会出现输出语句不同步的情况,例如(在没有缓冲区同步的机制情况下):

printf("test 1");
cout << "test 2" << endl;

输出:

test2test1

可以看到test2早于test1输出了,这是因为c语言机制,c语言缓冲区只有在遇到\n程序结束缓冲区满时才会刷新缓冲区。

缓冲区同步在C++中实现原理

C++为了解决在使用C/C++混合编程时带来的输出语句不同步的情况,在使用cout这一类输出语句时会去读取stdout指针指向输出缓冲区里的内容,如果stdout里有内容,那么强制调用fflush来刷新C语言的缓冲区,这样有效解决了缓冲区不同步的情况,但是也带来了不好的问题,那就是每次调用cout打印语句时它都会去检查缓冲区,如果我们不使用C/C++混合编程时它就极大的降低了我们程序的运行效率。

不使用缓冲区同步

如果在使用纯C++编程时我们是不会出现上述的情况的,所以C++提供了一个API:sync_with_stdio来为我们解决这个问题,通过这个API可以让C++不在去检查输出缓冲区,这个API一般用在纯C++编程或不使用stdio的情况下,因为使用它可能会导致缓冲区混乱的情况,它的函数原型如下:

void sync_with_stdio(bool sync = true);

synctrue时开启缓冲区同步
syncfalse时关闭缓冲区同步

注意事项

在一些项目中一般有自己的LOG模块,在一些大型项目中一般是多人开发,很难控制工程师们不去使用printfcout这类C/C++混合输出语句,但是你的LOG模块又是纯C++开发的,你在LOG模块里为了提升效率使用了sync_with_stdio关闭缓冲区同步,那么一定要写好醒目的注释或其它提示方法来告知工程师不要使用C语言的输出语句。

缓冲区同步仅针对stdout有效

对于stdin,它们对应的是输入操作,输入的内容会被存储到内存中,而不是直接输出到屏幕。因此,cinC++语句与C语言stdin之间不会有干扰或同步问题。

相关推荐

  1. c++缓冲区同步原理std::ios::sync_with_stdio作用

    2024-04-28 15:26:02       35 阅读
  2. C++的原子变量作用

    2024-04-28 15:26:02       33 阅读
  3. git 缓冲区查看设置

    2024-04-28 15:26:02       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-28 15:26:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-28 15:26:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-28 15:26:02       87 阅读
  4. Python语言-面向对象

    2024-04-28 15:26:02       96 阅读

热门阅读

  1. 故障诊断 | 基于GASF-CNN的状态识别研究

    2024-04-28 15:26:02       33 阅读
  2. 使用Vite+Vue 3+Qiankun构建微前端应用

    2024-04-28 15:26:02       32 阅读
  3. StatusBar,状态栏设置中文

    2024-04-28 15:26:02       30 阅读
  4. pam配置文件中[default=2 ignore=ignore success=ok]

    2024-04-28 15:26:02       28 阅读
  5. 前端小白学习Vue3框架(一)

    2024-04-28 15:26:02       29 阅读
  6. 裸金属服务器的优势有哪些?

    2024-04-28 15:26:02       36 阅读
  7. CentOS yum安装jdk8

    2024-04-28 15:26:02       31 阅读
  8. 【SQL函数:TO_CHAR】

    2024-04-28 15:26:02       34 阅读
  9. 怎么检查ubuntu22.04服务器机器被挖矿了

    2024-04-28 15:26:02       31 阅读
  10. 树莓派 ubuntu22.04 meta安装 ros2-humble

    2024-04-28 15:26:02       31 阅读
  11. 代码随想录算法训练营day39

    2024-04-28 15:26:02       26 阅读
  12. 基于机器学习的安全检测 网络入侵检测概述

    2024-04-28 15:26:02       34 阅读