파이썬에서 C++로 코테 주 언어를 바꿨는데 다른 사람들의 코드에 ios_base::sync_with_stdio(false);
cin.tie(nullptr);
이게 대부분 들어가 있길래 조사해보려고 한다.
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
아래 자료들을 참고하면 ios_base::sync_with_stdio(false), cin.tie(nullptr) 의 설정이 무엇인지 알 수 있다.
https://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio
https://en.cppreference.com/w/cpp/io/basic_ios/tie
우선 ios_base::sync_with_stdio
는 C++의 표준 스트림(cin, cout, cerr, clog)을 C의 표준 스트림(stdin, stdout, stderr)과 동기화 시킨다. 기본적으로는 이 설정이 켜져 있는데, 그 말은 즉슨 scanf와 cin, printf와 cout 같은 C와 C++ 입출력을 섞어 쓸 수 있도록 보장하는 것이다.
근데 이러한 동기화는 성능 저하를 유발할 수 있다. 그래서 프로그램이 C 입출력을 사용하지 않을 경우 이 동기화를 비활성화할 수 있다. 보통 C++ 코딩테스트에서는 C 입출력을 사용하지 않으므로 다들 ios_base::sync_with_stdio(false); 을 통해 비활성화한 것이었다.
그리고 basic_ios:tie
는 입력 스트림과 출력 스트림을 묶는(tie) 역할을 한다. 예를 들어 cin이 cout 에 묶여 있으면, cin으로 입력을 받기 전 cout 에 쌓여있던 출력 버퍼가 자동으로 비워진다(flush)
이렇게 자동으로 flush가 일어나는 이유는, 사용자에게 출력된 내용을 확실히 보여준 다음에 입력을 받도록 하기 위해서이다. 그런데 이러한 flush 동작을 항상 필요로 하는 게 아니라 때로는 성능을 떨어뜨리는 요소가 되기도 한다. 그래서 cin.tie(nullptr);
를 설정하면 cin과 cout의 연결이 끊어지면서 불필요한 flush를 피할 수 있어 입력 속도가 조금 더 빨라지게 된다.
코딩테스트와 같은 빠른 입출력이 중요한 상황에서는 이 설정이 유용하게 사용될 수 있다.
ios_base::sync_with_stdio(false);
cin
, cout
)과 C 스트림(scanf
, printf
) 간의 동기화를 끈다.cin.tie(nullptr);
cin
과 cout
간의 연결을 끊어, cin
호출 전 불필요한 cout
flush를 방지한다.결론적으로, 코딩 테스트에서 빠른 입출력을 위해 거의 모든 C++ 개발자들이 이 두 줄을 main 함수에 기본 세팅처럼 넣는 것이다.
입출력이 많은 문제에서 시간 초과를 피하려면 꼭 기억해두자!
ios_base::sync_with_stdio(false);
cin.tie(nullptr);