當前位置:首頁 » 編程語言 » c語言怎麼把東西放入高速緩存
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言怎麼把東西放入高速緩存

發布時間: 2022-07-03 03:30:02

c語言緩沖區在哪裡

緩沖區具體在哪裡是與操作系統、編譯器相關的
以VC++為例。察看getchar的源代碼(src\fgetchar.c),有:
int __cdecl _fgetchar (void){
return(getc(stdin));
}
#undef getchar
int __cdecl getchar (void){
return _fgetchar();
}
可見getchar()相當於getc(stdin)

繼續察看getc(src\fgetc.c),有一段(為便於閱讀,有刪減):
int __cdecl getc (FILE *stream){
int retval;
_ASSERTE(stream != NULL);
_lock_str(stream);
__try {
retval = _getc_lk(stream);
}
__finally {
_unlock_str(stream);
}
return(retval);
}

這段代碼里_lock_str其實是通過Win32 API提供的臨街區來鎖住文件
接收用戶輸入發生在_getc_lk,_getc_lk宏調用_filbuf。_filbuf在_filbuf.c中可以查看,這段代碼比較長,就不貼出來了
_filbuf主要是調用了_read(_fileno(stream), stream->_base, stream->_bufsiz)

而_read最終則是調用了Win32API ReadFile,以下是用WinDbg輸出的getchar的調用棧:
# ChildEBP RetAddr
00 0012fe6c 0040a4e7 kernel32!ReadFile
01 0012fea8 0040a3b9 TestStruct!_read_lk+0x107 [read.c @ 146]
02 0012fec0 00403140 TestStruct!_read+0x69 [read.c @ 75]
03 0012fee8 00401290 TestStruct!_filbuf+0xd0 [_filbuf.c @ 127]
04 0012ff08 004012cc TestStruct!fgetc+0x80 [fgetc.c @ 44]
05 0012ff14 0040103d TestStruct!getc+0xc [fgetc.c @ 56]
06 0012ff20 00401058 TestStruct!_fgetchar+0xd [fgetchar.c @ 37]
07 0012ff28 0040101e TestStruct!getchar+0x8 [fgetchar.c @ 47]
08 0012ff80 0040115c TestStruct!main+0xe [d:\my programs\teststruct\ts.cpp @ 4]
09 0012ffc0 7c816fe7 TestStruct!mainCRTStartup+0xfc [crt0.c @ 206]
0a 0012fff0 00000000 kernel32!BaseProcessStart+0x23

可見,getchar最終調用了ReadFile。關於ReadFile的原理以及緩沖區在哪裡,請你再提一個問我再回答

② C語言 讀取文件到內存

1.文件的大小。

文件大小:該文件所佔的存儲空間的大小,基本單位為位元組B,位元組向上分別為KB、MB、GB、TB,每級為前一級的1024倍,比如1KB=1024B,1M=1024KB。

2.是否可以不預先分配內存。

可以不預先分配跟文件大小一致的內存,但是從文件中讀出的每一行都要分配一個內存,可以為每一行設定一個固定的內存大小,比如A位元組,然後用C語言的malloc函數為該行數據分配內存,讀出數據後,判斷分配的內存是否夠用,如果不夠用,可以用C語言的realloc函數對該塊內存進行再分配。

malloc函數

malloc的全稱是memory allocation,中文叫動態內存分配,用於申請一塊連續的指定大小的內存塊區域以void*類型返回分配的內存區域地址,當無法知道內存具體位置的時候,想要綁定真正的內存空間,就需要用到動態的分配內存。

void* 類型表示未確定類型的指針。C,C++規定,void* 類型可以通過類型轉換強制轉換為任何其它類型的指針。

realloc函數

realloc的全程是reset allocation,中文名叫動態內存調整,用於調整一塊連續的已分配的內存塊區域。

3.數組和struct結構體的建立。

double數組:double a[100];

字元數組:char a[100];

struct結構體:

structst{

double a[100];

char b[100];

};



③ c語言傳文件清空緩存

scanf("%*[^\n]");
^取反或者「非」,[^\n]就是除了回車什麼都可以被scanf讀到。*表示被讀到了但是不把讀到值或者字元賦值給任何變數。
%*[^\n]就是讀取來自鍵盤的出去回車外的任意字元,並不賦值給變數。
scanf("%*c");
就一個*,和上邊表示一樣就是讀到了不賦值給任何變數。

再看,scanf("%[^\n]%*c",str)讀入一行字元,賦值給str變數。如果c前面沒有*,那麼就需要str後面再寫一個char類型的ch。這就告訴*表示讀到了但是不賦值給任何變數。
那麼scanf("%*[^\n]%*c")這句話,應該能理解了,兩個格式控制符裡面都有*,就是都讀到了都不賦值變數。

讀到這里應該差不多理解了,就是題中的兩句scanf(相當於scanf("%*[^\n]%*c"))讀到了輸入的abc,但是沒有賦值給任何變數。然後到了gets(str4);讀到了def賦值給str4,然後printf("%s\n", str4);後必然顯示def。

清空緩存區用fflush(stdin);這句代碼。
鍵盤輸入的東西都是放在緩沖區的這款區域,有變數過來了就帶走,沒有變數就在那裡呆著等待一個變數來帶它走。但是這個時候緩沖區裡面偶爾會有一些垃圾的字元,而影響了正常的輸入,有的時候用getchar()帶走一個兩個的字元,但是如果還是不見效一句fflush(stdin);就可以了。

④ [C++]請具體、詳細地解釋下什麼是【刷新輸出緩沖】。燃眉之急,萬分感謝!!

刷新輸出緩沖區
這個問題要先了解C++的輸出實現方式。
如果是輸出到終端(簡單舉例就算是屏幕上),一般不需要刷新緩沖區,因為會即時輸出到終端;
如果輸出到文件,由於文件操作速度很慢,一般是先保存在一個輸出緩沖區內。你可以想像成你申請了一段內存,輸出到文件時會先往這段內存里寫,一旦這段內存寫滿了,就立刻把內存中所有的內容一次性寫入文件,然後再重新填充緩沖區。除了緩沖區已滿,關閉已打開的文件時也會自動刷新。

在你的問題中,就是在輸出了一個換行後,讓程序刷新一下緩沖區,就是無論緩沖區是否已滿,都讓他直接寫入到文件中,而不去等待下一次輸出。其實,只要調用一個函數即可做到。

stream << std::endl; //stream是你打開的文件流,這個你應該明白哈
stream.flush();// 刷新緩沖區,這個就是刷新緩沖區

不明白可以繼續追問

⑤ C語言高速讀大文件、寫大文件的方式

寫文件一般是追加快些
如果你要輸出例如XML。
還有,每個進程應該有4G,靠操作系統內存管理+頁面文件維持、
還有,開個幾百M的數組不劃算、用malloc+free快些,可以動態的,不讓操作系統在載入時就開辟幾百M,而是陸續的開——除非你在寫匯編程序——匯編向OS申請內存很費勁,要 SYSCALL

⑥ C/C++如何准確的將代碼片段放入指定的高速緩沖區中並使其內存溢

第一次聽說有人想將高速緩沖區溢出!
要做這一點我想需要瞭解具體的晶元架構,intel會有這方面的晶元介紹。
其次就是瞭解操作系統的機制。
弱弱說句:高速緩存是由晶元硬體部件控制的,哪些內存經常訪問,就會將哪些內存同步到高速緩存,甚至於操作系統都沒法控制。高速緩沖區不存在溢出的問題。
以上是個人有限的最新intel晶元多核架構知識和有限的操作系統知識得出的結論,阿門。。。。

⑦ C語言里如何設置緩沖區,

很簡單的定義一個數組,用兩個變數下標來指向頭和尾,新數據來尾++ 老數據處理完頭++ 兩個下標超過界限時從頭開始循環利用 中間要考慮緩存數據空和數據滿的情況

或者你動態分配空間,來一個信號分配空間,插入隊列鏈表,處理完一個出隊列,釋放空間