코딩 테스트를 준비할때, 입출력 시간을 줄이기 위해
ios::sync_with_stdio(false); cin.tie(false);
과 같은 코드를 함께 입력한다. 그 이유는 무엇일까?
C++에서는 입력, 출력이 즉시 되는 것이 아니라 사실은 입력 버퍼, 출력 버퍼에 쌓아두고 있다가 버퍼를 비우는 방식으로 입출력을 처리한다.
입력 장치와 출력 장치(I/O)는 CPU의 처리 속도에 비해 극도로 느린 주변 장치이기 때문에 버퍼에 넣고, 느린 I/O 작업이 완료될 때까지 기다리지 않고 곧바로 다음 작업을 할 수 있다.
또한 데이터를 한 번에 모아서 버퍼에 저장하고, 버퍼가 꽉 차면 한꺼번에 처리하기 때문에 디스크 접근 횟수를 줄여 I/O 작업의 효율성을 높일 수 있다.
ios::sync_with_stdio(false) 명령어는 C++ 버퍼와 C 버퍼의 동기화를 해제하는 역할을 한다.
C++ 코드인 cin, cout과 C 코드인 printf, scanf를 섞어서 입출력을 진행하면 C++ 버퍼와 C 버퍼 간의 데이터가 동기화 되고, flush되는 작업이 추가로 발생하여 성능 저하가 일어난다.
따라서 이 명령어를 통해 C++ 스트림은 C 버퍼와 독립적으로 작동하여 성능 저하를 줄인다.
C++ 스트림에서 기본적으로 cin, cout 스트림은 연결되어 있다. 프로그램이 cin을 호출하여 입력을 요청하면, cout 버퍼에 쌓여 있는 모든 데이터를 자동으로 flush하여 화면에 출력한다.
cin.tie(false)는 이러한 자동 flush 기능을 해제하여 입출력 속도를 높이는 역할을 한다.
따라서 코딩테스트와 같이 빠른 입출력을 사용해야 하는 상황에서는 위의 두 명령어를 함께 사용하면 된다.