버퍼 비우기 란 무엇을 의미합니까?


95

저는 C ++를 배우고 있는데 이해할 수없는 것을 발견했습니다.

출력 버퍼를 명시 적으로 플러시하여 버퍼를 강제로 쓸 수 있습니다. 기본적으로 읽기 cin플러시 cout; cout프로그램이 정상적으로 종료 될 때도 플러시됩니다.

따라서 버퍼를 플러시 (예 : 출력 버퍼) : 버퍼에있는 모든 것을 삭제하여 버퍼를 지우거나 버퍼에있는 모든 것을 출력하여 버퍼를 지웁니까? 아니면 버퍼 플러시가 완전히 다른 의미입니까?

답변:


122

파일 쓰기를 고려하십시오. 이것은 비용이 많이 드는 작업입니다. 코드에서 한 번에 한 바이트 씩 쓰는 경우 한 바이트를 쓸 때마다 비용이 많이 듭니다. 따라서 성능을 향상시키는 일반적인 방법은 작성중인 데이터를 임시 버퍼에 저장하는 것입니다. 데이터가 많은 경우에만 파일에 버퍼가 기록됩니다. 쓰기를 연기하고 한 번에 큰 블록을 작성하면 성능이 향상됩니다.

이를 염두에두고 버퍼 비우기는 버퍼에서 파일로 데이터를 전송하는 작업입니다.

버퍼에있는 모든 것을 삭제하여 버퍼를 지우거나 버퍼에있는 모든 것을 출력하여 버퍼를 지우나요?

후자의.


1
감사. 하나 더. cin을 읽으면 cout이 플러시됩니다. 이 "reading cin"은 사용자가 무언가를 입력하거나 사용자가 무언가를 입력하라는 메시지를 받았을 때를 의미합니까?
Mohamed Ahmed Nabil 2013

4
cin 읽기는 스트림 연산자를 사용하여 cin에서 읽을 때 발생합니다. 일반적으로 읽을 때 cout을 플러시하려고합니다. 그렇지 않으면 입력이 프롬프트 앞에 나타날 수 있습니다.
David Heffernan 2013

1
@DavidHeffernan 내가 아는 한, cin과 cout이 연결되어 있기 때문에 cin 전에 cout을 플러시 할 필요가 없습니다 (Stroustrup, The C ++ Programming Language, [io.tie]).
sturmer

24

답변을 인용했습니다.

출력 버퍼를 명시 적으로 플러시하여 버퍼를 강제로 쓸 수 있습니다.

즉, 출력을 "플러시"하여 기본 스트림 (파일 또는 나열된 예제에서 터미널 일 수 있음)에 기록되도록해야 할 수 있습니다.

일반적으로 stdout / cout은 라인 버퍼링됩니다. 새 라인을 작성하거나 버퍼를 명시 적으로 플러시 할 때까지 출력이 OS로 전송되지 않습니다. 장점은 다음과 같은 std::cout << "Mouse moved (" << p.x << ", " << p.y << ")" << endl것이 기본 "파일"에 6 개가 아닌 한 번만 쓰기 때문에 성능면에서 훨씬 더 좋습니다. 단점은 다음과 같은 코드입니다.

for (int i = 0; i < 5; i++) {
    std::cout << ".";
    sleep(1); // or something similar
}

std::cout << "\n";

.....한 번에 출력 됩니다 (정확한 sleep구현은 이 질문 참조 ). 이러한 경우 << std::flush출력이 표시되도록 추가 로 확인해야합니다.

이를 위해 명시적인 플러시가 필요하지 않도록 cin플러시 읽기 cout:

std::string colour;
std::cout << "Enter your favourite colour: ";
std::cin >> colour;

(int i = 0; i <5; i ++) {std :: cout << "."; 수면 (1); } std :: cout << std :: endl; ..... 한 번에 인쇄하지 않습니다. 사이에 1 밀리 초로 인쇄합니다. sleep (1000)을 사용하면 더 많이 알 수 있습니다
Mohamed Ahmed Nabil 2013

@MohamedAhmedNabil sleep()(POSIX)와 Sleep()(Windows)
tc를

1
오래된 답변이지만 댓글은 내용이 적고 예제에 대한 것입니다. cout네임 스페이스 (예 :) 로 자격 을 부여 std::cout했지만 에는 자격 을 부여 하지 않았으므로 endl해당 자격도 필요합니다.
vol7ron

1
나는 당신의 모범을 좋아합니다. 하지만 endl이 버퍼를 플러시한다고 생각했지만 귀하의 예에서는 \ n이 버퍼를 플러시합니다. 혼란 스럽습니다.
Naz

1
@Naz \ n 버퍼를 플러시하지 않습니다. 버퍼는 그의 예제에서 프로그램의 끝에서만 플러시됩니다 (버퍼는 항상 C ++ 프로그램의 끝에서 자동으로 플러시됩니다). \ n은 형식을 지정하는 데 사용되었을 수 있습니다. 또한 std :: endl이 버퍼를 플러시한다는 것이 옳습니다 (std :: flush도 마찬가지지만 자명합니다).
liamnickell

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.