Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 버퍼 플러시(Buffer Flush)란 무엇일까? 개념부터 실전 예제까지

버퍼 플러시(buffer flush)는 컴퓨터 데이터를 임시 저장 영역(버퍼)에서 영구 메모리나 출력 장치로 전송하는 작업을 말합니다. 예를 들어 파일의 내용을 수정할 때, 화면에 보이는 변경 사항은 곧바로 저장되는 것이 아니라 일단 버퍼라는 임시 공간에 먼저 저장됩니다.

왜 버퍼 플러시가 필요한가?

C++에서는 성능 향상을 위해 출력 데이터를 즉시 전송하지 않고 버퍼에 모아 두었다가 한 번에 처리합니다. 하지만 이 때문에 실시간으로 출력 결과를 확인해야 하는 상황에서는 버퍼가 비워지지 않아 화면에 아무것도 나타나지 않는 문제가 발생할 수 있습니다. 이때 명시적으로 플러시를 호출하여 버퍼의 내용을 강제로 출력 장치로 밀어낼 수 있습니다.

대표적인 방법은 두 가지입니다.

  • std::endl: 개행 문자(newline)를 추가하는 동시에 버퍼를 자동으로 플러시합니다.
  • flush: 개행 없이 버퍼만 비우고 싶을 때 명시적으로 사용합니다.

플러시를 사용하지 않은 예제

다음 프로그램은 숫자를 하나씩 출력하고 매번 1초씩 대기하지만, 플러시를 호출하지 않습니다. 모든 숫자가 버퍼에 쌓일 때까지는 화면에 아무런 출력이 나타나지 않다가, 루프가 끝난 후 숫자들이 한꺼번에 표시됩니다.

#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)); // 1초 대기
    }
    cout << endl;
}

실행 결과

1 2 3 4 5
→ 약 5초 후에 모든 숫자가 한 번에 출력됨

플러시를 사용한 예제

이번에는 각 숫자를 출력할 때마다 flush를 호출합니다. 이렇게 하면 숫자가 출력될 때마다 버퍼가 비워져 화면으로 전송되므로, 1초 간격으로 숫자가 하나씩 차례대로 나타나는 것을 확인할 수 있습니다.

#include <iostream>
#include <thread>
#include <chrono>
using namespace std;

int main() {
    for (int x = 1; x <= 5; ++x) {
        cout << x << " " << flush;
        this_thread::sleep_for(chrono::seconds(1)); // 1초 대기
    }
    cout << endl;
}

실행 결과

1 2 3 4 5
→ 각 숫자가 출력된 후 1초씩 기다리며 순차적으로 표시됨

정리

플러시를 사용하면 버퍼에 남아 있는 출력 내용이 즉시 디스플레이로 전송됩니다. 진행 상황을 실시간으로 보여줘야 하는 프로그램이라면 endl 또는 flush를 적절히 활용하는 것이 중요합니다. 반대로 대량의 출력을 빠르게 처리해야 하는 경우에는 불필요한 플러시를 줄이는 것이 성능에 유리합니다.