C语言的输入缓冲区与输出缓冲区是否为不同的缓冲区?
关于C标准库缓冲机制实现的方案建议
首先直接给结论:你完全应该为输入、输出分别设置两个独立缓冲区,这也是当前所有主流标准C库stdio模块的通用实现方案,比共用缓冲区的设计更合理,运行开销也更低。
共用缓冲区的核心缺陷
你现在遇到的开销问题就是共用缓冲区的天生弊端:
- 每次读写操作切换都需要强制刷新缓冲区,哪怕前序操作根本没有往缓冲区写入数据,也需要做一次状态判断、甚至系统调用,额外开销极高
- 依赖全局变量存储最近操作的文件描述符、操作类型,不仅会导致多个文件操作的状态互相干扰,也完全不支持重入、多线程场景,不符合C标准对
FILE系列函数的行为要求
双缓冲区的优势
读写分开缓冲的方案可以完全规避上述问题:
- 读写操作完全解耦,执行
fgets读操作时不需要管输出缓冲区的状态,执行fputs写操作时也不需要处理输入缓冲区的残留数据,仅在缓冲区满、主动调用fflush、关闭文件这几个特定场景才需要执行刷入/刷出的系统调用,整体开销远低于你现在的切换刷新方案 - 不需要维护全局状态,你可以把读缓冲区指针、读偏移、写缓冲区指针、写偏移、缓冲类型(全缓冲/行缓冲/无缓冲)、对应文件描述符这些字段都封装到自定义的类
FILE结构体中,每个文件的操作状态完全独立,不会互相干扰
实现补充提示
如果要兼容C标准的默认缓冲规则,只需要在结构体的状态位中标记缓冲类型即可:比如终端对应的stdin/stdout默认标记为行缓冲,写入输出缓冲区时遇到\n就自动刷新,读取输入缓冲区时按行返回数据,实现逻辑也比共用缓冲区简单很多。
内容的提问来源于stack exchange,提问作者user14933221
相关产品推荐
相关产品推荐

