关于输入输出缓冲区问题

wpalhm 2007-11-22 10:47:30
请问:
c++中输入输出缓冲区的实现原理?
比如是不是每一次cout都去申请一个缓冲区?那缓冲区又与屏幕的显示如何联系的?
比如这样一段代码:
int i(0);
cout << i << " " << i++ << endl;
这里的cout先执行i++,得到了一个值(0),是在这个时候把值存入的缓冲区吗?
一般缓冲适于分批量的小数据输入输出.那么大的数据输入输出又当如何实现呢?
...全文
575 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
wvhuihui 2012-10-21
  • 打赏
  • 举报
回复

飘过 看看大神么在干什么……
yjugdujcm 2011-03-15
  • 打赏
  • 举报
回复
顶下,不太懂啊
cj_041370 2010-04-27
  • 打赏
  • 举报
回复
那么接近机器本身的东西
都不用高级语言实现的
cj_041370 2010-04-27
  • 打赏
  • 举报
回复
c++中输入输出缓冲区的实现原理?
其实是利用 硬件程序的接口实现的

输入输出缓冲区的实现在汇编
wpalhm 2007-11-26
  • 打赏
  • 举报
回复
再顶一下吧。
mu_yang 2007-11-26
  • 打赏
  • 举报
回复
这帖子有点意思
jxcui 2007-11-26
  • 打赏
  • 举报
回复
感觉14楼说的有道理
wpalhm 2007-11-25
  • 打赏
  • 举报
回复
难道都没一个人能给我一个确切(通俗易懂)一点的答案吗?
herman~~ 2007-11-23
  • 打赏
  • 举报
回复
mark一个

输入输出的实现原理确实还没研究过,有空再回来看看
wpalhm 2007-11-23
  • 打赏
  • 举报
回复
怎么一个一个都不一样.到底谁是对的..
PcrazyC 2007-11-23
  • 打赏
  • 举报
回复

int i=0
cout<<i<<i++;


就以这段代码为例,假设A是缓存区,首先遇到第一个"<<",&I入队列,然后遇到第二个<<,同样&I入队列,由于I++是先用后加,所以先将I输出,然后再加,也就是输出00,然后I=I+1;

如果是下面的就应该输出11了

int i=0
cout<<i<<++i;


一般的编译器都是这样处理的,可能有些编译器不这么处理 ,这个我就不清楚了
wpalhm 2007-11-23
  • 打赏
  • 举报
回复
还是不清楚.能不能讲详细点.
wpalhm 2007-11-22
  • 打赏
  • 举报
回复

如果猜测输出流是一个堆栈.
那么根据堆栈(先进后出).对这样的代码:
cout < < i < < " " < < i++ < < endl;
会有这样的解释:
同样先把i++得到的值(0)放入缓冲区(队列)中,然后是 " ",然后是i的值(1).最后去中断显示到屏幕.
那么缓冲区的数据应该是这样:
1 "  " 0 (endl)
(进去)---->
<------(出去)
按照先进后出,1先出去,然后是" ",然后是0.
结果就是:1 0
这个似乎可以和输出结果一致,但是还有个问题,这里的endl呢?又当做如何解释.
操纵符endl写入到输出流时,具有输出换行的效果,并刷新与设备相关的缓冲区.

这里遇到endl的时候.到底是由endl去中断的,还是由中断时来处理endl;


wpalhm 2007-11-22
  • 打赏
  • 举报
回复
不是很懂啊!
A:我们大胆猜测它是一个队列,在队满,强制等条件所有数据出队。缓冲区解决了数据在输出到终端时可能造成的无序问题

这里提到缓冲区是队列.
那么应该是先进现出了.

A:在通常情况,cout会将值先写入缓冲区,这是并没有输出到终端,等达到缓冲区刷新条件时,通过中断系统调用来输出到屏幕,或者其他终端
对这样的代码做何解释:

cout << i << " " << i++ << endl;
按照你的意思是不是这样:
先把i++得到的值(0)放入缓冲区(队列)中,然后是" ",然后是i的值(1).最后去中断显示到屏幕.
那么缓冲区的数据应该是这样:
1 " " 0
按照先进现出,0先出来,然后是" ",然受是1.那么显示结果应该是:0 1
这显然与结果不一致:1 0




飞哥 2007-11-22
  • 打赏
  • 举报
回复
不能的 -> 不停的
飞哥 2007-11-22
  • 打赏
  • 举报
回复
c++中输入输出缓冲区的实现原理?
A:我们大胆猜测它是一个队列,在队满,强制等条件所有数据出队。缓冲区解决了数据在输出到终端时可能造成的无序问题


比如是不是每一次cout都去申请一个缓冲区?那缓冲区又与屏幕的显示如何联系的?
比如这样一段代码:
int i(0);
cout < < i < < " " < < i++ < < endl;
这里的cout先执行i++,得到了一个值(0),是在这个时候把值存入的缓冲区吗?
A:在通常情况,cout会将值先写入缓冲区,这是并没有输出到终端,等达到缓冲区刷新条件时,通过中断系统调用来输出到屏幕,或者其他终端

A:一般缓冲适于分批量的小数据输入输出.那么大的数据输入输出又当如何实现呢?
好像缓冲区大小没有什么限制,是系统提供的库函数做了限制,达到一定数据量即刷新数据,针对大数据量的数据需要考虑到输出造成的性能问题,如果你不考虑这一点,很显然,按照相同的方式输出是没有问题的,只不过会造成系统不能的进行中断处理,(这个比函数调用开销大的多),所以不建议输出大量信息,可以通过其他方式处理。针对具体的问题具体分析
wpalhm 2007-11-22
  • 打赏
  • 举报
回复
谢谢你的解答.
可是不是很懂.能清楚点吗?
zhangyanli 2007-11-22
  • 打赏
  • 举报
回复
其实这些都是作为参数传入cout的成员operator<<函数的参数,好像再建立流对象的时候建立缓冲区。缓冲区慢的话,输出。

这里的顺序是有些问题,最起码和我们想象的有些出入。比如先i++,

如果是比较大的对象,那也这样输出,只要它可以传给operator<<,一般需要在类里重载operator<<,输出过程和一般的没什么区别
飞哥 2007-11-22
  • 打赏
  • 举报
回复
如果数据量大中断很耗资源,开销太大,可以通过其他方式输出(? 如果可以不输出就不输出,写文件也比输出省资源)
飞哥 2007-11-22
  • 打赏
  • 举报
回复
若果每次都申请一个缓冲区,那就不叫缓冲了吧

先把值写到缓冲区,还没到屏幕,然后使用endl刷新缓冲区
强制将数据送到屏幕,通过中断实现
加载更多回复(4)

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧