GetChar快取機制深入剖析

2022-09-29 04:39:09 字數 1977 閱讀 9224

與快取區相關最常見的操作就是字元的輸入與輸出操作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是如何優化這部分的效能開銷?接觸過系統設計的同學都知道,對於頻繁的資料獲取,在資料未變化的情形下,可以通過增加快取來優化效能,因為...