在C++中,輸入流(如cin
)使用緩沖區(qū)來提高輸入性能
全局緩沖區(qū):這是C++標(biāo)準(zhǔn)庫中所有輸入流(如cin
和scanf
)共享的緩沖區(qū)。全局緩沖區(qū)的大小通常為4096字節(jié)或8192字節(jié)。當(dāng)你在程序中使用cin
或scanf
進(jìn)行輸入時(shí),數(shù)據(jù)首先被讀取到全局緩沖區(qū)中,然后才被處理。
函數(shù)級緩沖區(qū):在某些情況下,你可能需要使用函數(shù)級緩沖區(qū)。例如,當(dāng)你在循環(huán)中多次調(diào)用cin
時(shí),可能會遇到性能問題,因?yàn)槊看握{(diào)用cin
時(shí),都需要將數(shù)據(jù)從全局緩沖區(qū)復(fù)制到程序中的變量。為了解決這個(gè)問題,你可以使用std::cin.rdbuf()
函數(shù)來更改輸入流的緩沖區(qū)。例如,你可以創(chuàng)建一個(gè)自定義的緩沖區(qū)并將其分配給cin
,以便在循環(huán)中多次調(diào)用cin
時(shí)提高性能。
以下是一個(gè)簡單的示例,展示了如何使用自定義緩沖區(qū):
#include <iostream>
#include <streambuf>
int main() {
// 創(chuàng)建一個(gè)自定義緩沖區(qū)
std::string buffer(1024, '\0');
// 將自定義緩沖區(qū)分配給cin
std::cin.rdbuf(buffer.data());
int n;
while (std::cin >> n) {
std::cout << "You entered: "<< n << std::endl;
}
// 將cin的緩沖區(qū)更改回默認(rèn)緩沖區(qū)
std::cin.rdbuf(nullptr);
return 0;
}
在這個(gè)示例中,我們創(chuàng)建了一個(gè)大小為1024字節(jié)的自定義緩沖區(qū),并將其分配給cin
。這樣,在循環(huán)中多次調(diào)用cin
時(shí),數(shù)據(jù)將直接從緩沖區(qū)讀取,而無需每次都從全局緩沖區(qū)復(fù)制。在循環(huán)結(jié)束后,我們將cin
的緩沖區(qū)更改回默認(rèn)緩沖區(qū)。