关于输入输出缓冲区问题
请问:
c++中输入输出缓冲区的实现原理?
比如是不是每一次cout都去申请一个缓冲区?那缓冲区又与屏幕的显示如何联系的?
比如这样一段代码:
int i(0);
cout << i << " " << i++ << endl;
这里的cout先执行i++,得到了一个值(0),是在这个时候把值存入的缓冲区吗?
一般缓冲适于分批量的小数据输入输出.那么大的数据输入输出又当如何实现呢?
[解决办法]
若果每次都申请一个缓冲区,那就不叫缓冲了吧
先把值写到缓冲区,还没到屏幕,然后使用endl刷新缓冲区
强制将数据送到屏幕,通过中断实现
[解决办法]
其实这些都是作为参数传入cout的成员operator<<函数的参数,好像再建立流对象的时候建立缓冲区。缓冲区慢的话,输出。
这里的顺序是有些问题,最起码和我们想象的有些出入。比如先i++,
如果是比较大的对象,那也这样输出,只要它可以传给operator<<,一般需要在类里重载operator<<,输出过程和一般的没什么区别
[解决办法]
c++中输入输出缓冲区的实现原理?
A:我们大胆猜测它是一个队列,在队满,强制等条件所有数据出队。缓冲区解决了数据在输出到终端时可能造成的无序问题
比如是不是每一次cout都去申请一个缓冲区?那缓冲区又与屏幕的显示如何联系的?
比如这样一段代码:
int i(0);
cout < < i < < " " < < i++ < < endl;
这里的cout先执行i++,得到了一个值(0),是在这个时候把值存入的缓冲区吗?
A:在通常情况,cout会将值先写入缓冲区,这是并没有输出到终端,等达到缓冲区刷新条件时,通过中断系统调用来输出到屏幕,或者其他终端
A:一般缓冲适于分批量的小数据输入输出.那么大的数据输入输出又当如何实现呢?
好像缓冲区大小没有什么限制,是系统提供的库函数做了限制,达到一定数据量即刷新数据,针对大数据量的数据需要考虑到输出造成的性能问题,如果你不考虑这一点,很显然,按照相同的方式输出是没有问题的,只不过会造成系统不能的进行中断处理,(这个比函数调用开销大的多),所以不建议输出大量信息,可以通过其他方式处理。针对具体的问题具体分析
[解决办法]
不能的 -> 不停的
[解决办法]
int i(0);
cout < < i < < " " < < i++ < < endl;
如果“i“是auto类型的变量,那么就在栈中给其开辟一段存储空间,根据栈的特性,输出结果就是你所想要得。
关于"endl,或'\n'“:当遇到其或缓冲区满时,就会发出中断请求,当cpu相应中断请求后,就调用输出函数,将
栈中的数据输出到屏幕上。
[解决办法]
缓存是一个队列,用COUT输出时,首先将表达式存入缓存中,这个时候存入的只是地址,当缓存区满后或要输出的表达式已经完了,就会将队列输出了,这个时候输出的是表达式的值
[解决办法]
int i=0cout<<i<<i++;
[解决办法]
mark一个
输入输出的实现原理确实还没研究过,有空再回来看看