關於緩沖區的詳細介紹,請參考
(1)c++中cin、cout,cerr和c的stdin、stdout、stderr都是同步的,即iostream 對象和 and cstdio流是同步的,同步關系如下:
同步即表明我們可以在程序中混合用cout和printf或其他對應的流對。可以用std::ios_base::sync_with_stdio(false)來取消這種同步,取消后,如下程序中cout和printf就不是按照預期的順序輸出
std::ios_base::sync_with_stdio(false);
for(int i = 0 ; i < 10; i++)
{
cout<<"1 ";
printf("2 ");
}
windows下輸出是:2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
linux下是:1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2
正是因為這種同步,所以cin、cout比scanf、printf速度要慢,如果我們在使用cin、cout輸入輸出前加一句std::ios_base::sync_with_stdio(false),其實速度和scanf、printf差不多。速度對比可以參考探尋C++最快的讀取文件的方案
(2)以下程序
for(int i = 0 ; i < 10; i++)
{
cout<<"1 ";
}
while(1);
以上程序在windows下立即輸出10個1,linux下不輸出。說明windows下默認cout是無緩沖的(window可以通過cout<<stdout->bufsiz來查看緩沖區大小,windows不能這么做),linux下是有緩沖的。(cout換成printf也是一樣)
(3)我們可以通過函數setbuf 和 setvbuf 自己設置輸入輸出流的緩沖區,需要注意的是不管程序中申請的的緩沖區實際大小為多少,setbuf都將緩沖區設置的大小為BUFSIZ(這個宏在windows下是512,ubuntu下是1024), setvbuf則可以設置緩沖區大小以及緩沖區的模式(行緩沖、全緩沖、無緩沖),需要注意的是這兩個函數設置的是c的輸入輸出緩沖區,因為c++和c的緩沖區是同步的,所有該函數會對c++有影響 本文地址
char buf[1024];
setbuf(stdout, buf);
for(int i = 0 ; i < 10; i++)
{
cout<<"1 ";
}
while(1);
此時windows和linux下都沒有輸出1
(4)因為默認情況下,cin是和cout綁定的,cin 會刷新cout的緩沖區,可以用函數cin.tie(0)來解綁定。所以在上面代買的基礎上,在while(1); 前面加上:int a; cin>>a; 此時所有的1就可以輸出了。
char buf[1024];
setbuf(stdout, buf);
for(int i = 0 ; i < 10; i++)
{
cout<<"1 ";
}int a; cin>>a;
while(1);
加上cin.tie(0)后,以下的代碼沒有輸出1,因為cin已經和cout解綁定了,cin刷新不了cout的緩沖區。(可以cin.tie(&cout)來綁定,注意cout沒有tie方法)
char buf[1024];
setbuf(stdout, buf);
cin.tie(0);
for(int i = 0 ; i < 10; i++)
{
cout<<"1 ";
}int a; cin>>a;
while(1);
有點奇怪的是以下代碼還是會輸出1,即默認緩沖區的情形下,接觸綁定沒有產生效果。stackoverflow是這樣解釋的
cin.tie(0);
for(int i = 0 ; i < 10; i++)
{
cout<<"1 ";
}int a; cin>>a;
while(1);
【版權聲明】轉載請注明出處:http://www.cnblogs.com/TenosDoIt/p/3733243.html