입출력 속도 개선을 위해 저 구문을 항상 써주는 편인데 실제로 어떤 의미를 가지고 있는지 자세히 알아본 적이 없었다.
결론부터 말하자면 저 구문의 의미는 C 표준스트림과 C++ 표준 스트림의 동기화를 끊는다는 것이다.
기본적으로 C++은 C 스트림 버퍼를 사용한다. 따라서 C 스타일 입출력, C++ 스타일 입출력을 혼용해도 순서가 보장된다.
그러나 저 구문을 통해 동기화를 끊는다면 C++은 자신만의 버퍼를 사용하게 된다. 버퍼를 따로 사용하니 실행속도는 빨라지지만 C, C++ 출력 순서가 보장되지 않는다. 따라서 C, C++ 입출력을 섞어서 쓸 수 없다.
(나도 저 구문을 사용했을 때에는 무조건 iostream 입출력만을 사용한다.)
이 구문은 cin과 cout의 tie를 풀어준다.
원래는 cin와 cout은 연결되어 있어서 다음 입출력이 들어오기 전에 자동으로 flush 되지만 cin.tie(nullptr)를 사용하면 이 tie가 끊어지면서 잦은 flush가 일어나는 것을 막아주기 때문에 입출력 속도가 빨라진다.
그러나 입출력 순서가 보장되지 않기 때문에 코테 외에는 사용하지 않는 것이 좋다.
C++에서는 주로 개행문자로 endl을 사용한다.
endl은 개행할 때 flush를 무저건 해주기 때문에 속도 저하가 일어날 수 있다.
코테처럼 속도 1초가 중요한 테스트에서는 endl 대신 \n를 사용해 주는 것이 좋다.
나는 처음에
#define endl '\n'
를 사용하여 endl 대신 \n을 사용하도록 하는 방법을 사용한다.