저는 C ++를 배우고 있는데 이해할 수없는 것을 발견했습니다.
출력 버퍼를 명시 적으로 플러시하여 버퍼를 강제로 쓸 수 있습니다. 기본적으로 읽기
cin
플러시cout
;cout
프로그램이 정상적으로 종료 될 때도 플러시됩니다.
따라서 버퍼를 플러시 (예 : 출력 버퍼) : 버퍼에있는 모든 것을 삭제하여 버퍼를 지우거나 버퍼에있는 모든 것을 출력하여 버퍼를 지웁니까? 아니면 버퍼 플러시가 완전히 다른 의미입니까?
저는 C ++를 배우고 있는데 이해할 수없는 것을 발견했습니다.
출력 버퍼를 명시 적으로 플러시하여 버퍼를 강제로 쓸 수 있습니다. 기본적으로 읽기
cin
플러시cout
;cout
프로그램이 정상적으로 종료 될 때도 플러시됩니다.
따라서 버퍼를 플러시 (예 : 출력 버퍼) : 버퍼에있는 모든 것을 삭제하여 버퍼를 지우거나 버퍼에있는 모든 것을 출력하여 버퍼를 지웁니까? 아니면 버퍼 플러시가 완전히 다른 의미입니까?
답변:
파일 쓰기를 고려하십시오. 이것은 비용이 많이 드는 작업입니다. 코드에서 한 번에 한 바이트 씩 쓰는 경우 한 바이트를 쓸 때마다 비용이 많이 듭니다. 따라서 성능을 향상시키는 일반적인 방법은 작성중인 데이터를 임시 버퍼에 저장하는 것입니다. 데이터가 많은 경우에만 파일에 버퍼가 기록됩니다. 쓰기를 연기하고 한 번에 큰 블록을 작성하면 성능이 향상됩니다.
이를 염두에두고 버퍼 비우기는 버퍼에서 파일로 데이터를 전송하는 작업입니다.
버퍼에있는 모든 것을 삭제하여 버퍼를 지우거나 버퍼에있는 모든 것을 출력하여 버퍼를 지우나요?
후자의.
답변을 인용했습니다.
출력 버퍼를 명시 적으로 플러시하여 버퍼를 강제로 쓸 수 있습니다.
즉, 출력을 "플러시"하여 기본 스트림 (파일 또는 나열된 예제에서 터미널 일 수 있음)에 기록되도록해야 할 수 있습니다.
일반적으로 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;
sleep()
(POSIX)와 Sleep()
(Windows)
cout
네임 스페이스 (예 :) 로 자격 을 부여 std::cout
했지만 에는 자격 을 부여 하지 않았으므로 endl
해당 자격도 필요합니다.