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