Xóa bộ đệm (buffer flush) là quá trình chuyển dữ liệu từ vùng nhớ tạm (buffer) sang bộ nhớ vĩnh viễn hoặc thiết bị xuất (màn hình, file). Trong C++, luồng xuất (output stream) thường được đệm (buffered) để tối ưu hiệu suất.
Cơ chế hoạt động
- Dữ liệu ghi ra
coutđược lưu tạm trong buffer - Buffer tự động xóa khi: đầy, gặp ký tự newline (
\nvớistd::endl), hoặc chương trình kết thúc - Có thể ép buộc xóa buffer bằng
std::flushhoặcstd::endl
Ví dụ 1: Không xóa buffer (buffered output)
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
int main() {
for (int x = 1; x <= 5; ++x) {
cout << x << " ";
this_thread::sleep_for(chrono::seconds(1)); // đợi 1 giây
}
cout << endl;
}
Kết quả
1 2 3 4 5 (xuất hiện cùng lúc sau 5 giây)
Các số chỉ hiển thị sau khi vòng lặp kết thúc vì buffer chưa được xóa.
Ví dụ 2: Xóa buffer sau mỗi lần ghi (unbuffered output)
#include <iostream>
#include <thread>
#include <chrono>
using namespace std;
int main() {
for (int x = 1; x <= 5; ++x) {
cout << x << " " << flush; // ép buộc xóa buffer
this_thread::sleep_for(chrono::seconds(1));
}
cout << endl;
}
Kết quả
1 (sau 1 giây) 2 (sau 1 giây) 3 (sau 1 giây) 4 (sau 1 giây) 5 (sau 1 giây)
Mỗi số hiển thị ngay lập tức nhờ flush.
Các cách xóa buffer phổ biến
| Phương pháp | Mô tả |
|---|---|
std::endl | Thêm newline và xóa buffer |
std::flush | Chỉ xóa buffer, không thêm ký tự |
std::cout.flush() | Gọi phương thức flush() trực tiếp |
std::unitbuf | Bật chế độ xóa buffer sau mỗi lần ghi: cout << std::unitbuf; |
Khi nào nên dùng flush?
- Ghi log theo thời gian thực
- Hiển thị tiến trình (progress bar)
- Giao tiếp giữa các tiến trình (IPC)
- Gỡ lỗi (debugging) để xem output ngay lập tức