與快取區相關最常見的操作就是字元的輸入與輸出操作getchar,getc,getch,getche,gets系列函式。
第乙個例子(與getchar有關):
複製** **如下:
#include
int main()
**如上,當輸入乙個字元按下回車後程式沒有等待你二次輸入就結束了,而且無論輸入什麼執行結果均是10,是不是很奇怪(反正我第一次遇到時感覺是很奇怪),更奇怪的是當你一次性輸入多個字元如abcd結果又正確的列印出了98,為什麼呢?這就是緩衝區的原因。
解釋如下:getchar定義在stdio.**件中,我們在stdio.h中可以找到其相關的定義:
複製** **如下:
#define getchar() getc(stdin)//即getchar等同於呼叫getc(stdin)
我們又找到getc的定義
複製** **如下:
#define getc(_stream) (--(_stream)->_cnt >= 0 \
? 0xff & *(_stream)->_ptr++ : _filbuf(_stream))
將其展開即得:
複製** **如下:
if(--(stdin)->_cnt>=0)
return 0xff&*(stdin)->ptr++;
複製** **如下:
else
return filbuf(stdin);
**譯如下stdin是標準輸入流,檢視msdn與stdio.h中可以看到定義如下:
stdio.h中:
複製** **如下:
#define stdin (&_iob[0])
跟蹤即可得:
複製** **如下:
_crtimp extern file _iob;
從上面**可得_iob是file結構型別的,檢視stdio.h中可以看到file結構體定義如下:
複製** **如下:
struct _iobuf ;
從file結構中我們可以得到了上面getc巨集定義中使用的_cnt,_ptr成員,但這些都是次要的,我們應該不難發現有這樣幾個成員_bufsize,_base分別對應的是緩衝區大小,緩衝區基位址,從程式設計客棧這裡得到乙個顯而意見的結論就是getchar函式使用了緩衝機制。(_cnt對應的是緩衝區的輸入的位元組數目,_ptr對應的是讀指標的位置)
getc巨集定義詳解
複製** **如下:
--(stdin)->_cnt>=0
此句判斷是否緩衝區內有資料,有的話就減一(表示又讀了乙個),並讀取資料return 0xff&*(stdin)->ptr++,讀完成後,將讀指標向前移乙個位置【重要】
好了,講了這麼多都是鋪墊,現在回到正題為什麼會出現上述結果:)
出現上述結果追根結底還是由於getchar函式使用了緩衝(看了上面的,我想大家也知道了,確實使用了緩衝),當輸入乙個字元按下回車後程式沒有等待你二次輸入就結束了,而且無論輸入什麼執行結果均是10,這是因為當使用者輸入了乙個字元後,並按下回車後,緩衝中會存入使用者輸入的字元以及換行鍵的ascii碼(10 ~)【略去的回車的ascii碼13,可能是為了跨平台,在linux下,回車後就是換行10,windows下回車是先回車回到首行,再換行,即13 10】(執行第一次getchar實際上是執行getc的else語句,填充快取區後_cnt=2,_prt指向0位置,執行完後_cnt=1,_prt指向1位置),第二次執行getchar時,呼叫getc不會再執行else語句,執行的是if語句,故第二次不再等待使用者輸入了,直接執行,執行後cnt=0,prt指向位置2,並返回ptr指向位置1時的結果,即10,由於10為換行鍵,當執行遇到此時,會在執行完後清空快取,ptr重新指向了位置0,cnt=0。
當輸入abc的時候分析一樣,只不過掃行了第二個getchar後,cnt=2,ptr指向了位置2。
本文標題: getchar快取機制深入剖析
本文位址: /ruanjian/c/99649.html
輸入執行GetChar快取機制剖析
與快取區相關最常見的操縱就是字元的輸入與輸出操縱getchar,getc,getch,getche,gets系列函式。第乙個例子 與getchar有關 includeint main 如上,當輸入乙個字元按下回車後程式沒有等待你二次輸入就結束了,而且無論輸入什麼執行結果均是10,是不是是很奇怪 反正...
深入剖析nginx時間快取
本文適合對nginx實現原理比較感興趣的同學閱讀,需要具備一定的服務端程式設計知識。在伺服器開發領域,時間的準確度關係到系統能否正常執行,尤其是當系統中存在超時事件需要處理時。但是系統時間的獲取需要一次昂貴的系統呼叫,作為一款成熟的伺服器軟體,nginx是如何優化這部分的效能開銷?接觸過系統設計的同...
深入剖析Nginx時間快取
在伺服器開發領域,時間的準確度關係到系統能否正常執行,尤其是當系統中存在超時事件需要處理時。但是系統時間的獲取需要一次昂貴的系統呼叫,作為一款成熟的伺服器軟體,nginx是如何優化這部分的效能開銷?接觸過系統設計的同學都知道,對於頻繁的資料獲取,在資料未變化的情形下,可以通過增加快取來優化效能,因為...