Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Xóa bộ đệm (Buffer Flush) trong C++

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 (\n với std::endl), hoặc chương trình kết thúc
  • Có thể ép buộc xóa buffer bằng std::flush hoặc std::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ápMô tả
std::endlThêm newline và xóa buffer
std::flushChỉ xóa buffer, không thêm ký tự
std::cout.flush()Gọi phương thức flush() trực tiếp
std::unitbufBậ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