C++로 알고리즘을 풀 때 실행 속도를 높이기 위해 아래 구문을 작성해준다.
ios_base::sync_with_stdio(false);
cin.tie(NULL);
ios_base::sync_with_stdio(false); 의 장점
ios_base::sync_with_stdio 구문은 c의 stdio와 cpp의 iostream을 동기화시켜주는 역할을 한다
이 때 iostream과 stdio의 버퍼를 모두 사용하기 때문에 딜레이가 발생한다. 따라서,
ios_base::sync_with_stdio(false);코드를 작성해줌으로써 동기화를 비활성화시켜준다.
이로 인해, c++만의 독립적인 버퍼가 생성되어 c의 버퍼와 병행하여 사용할 수 없게 되지만,
사용하는 버퍼의 수가 줄어들었기 때문에 실행 속도는 빨라지게 된다.
알고리즘 문제를 풀 때는 대부분 싱글 쓰레드 환경이기 때문에
해당 코드를 추가해줘도 문제가 발생하지 않을 확률이 높다.
ios_base::sync_with_stdio(false); 의 단점
동기화된 C++ 버퍼의 경우 thread-safe 하기 때문에 모든 IO의 순서가 예상한 것과 정확히 일치함을 보장 할 수 있다.
하지만, ios_base::sync_with_stdio(false); 코드를 추가함으로 인해 동기화가 비활성화됐기 때문에 멀티 쓰레드
환경에서는 출력 순서를 보장할 수 없다.
그리고 버퍼가 분리되었기 때문에 cin과 C의 scanf, gets, getchar 등을 같이 사용하면 안되고
cout과 C의 printf, puts, putchar 등을 같이 사용하면 엉뚱한 결과가 나올 확률이 높기 때문에 사용하면 안 된다.
cin.tie(NULL), cout.tie(NULL);
cin.tie(null); 코드는 cin과 cout의 묶음을 풀어준다.
기본적으로 cin과 cout은 묶여있고 묶여있는 스트림들은 한 스트림이 다른 스트림에서 각 IO 작업을 진행하기
전에 자동으로 버퍼를 비워줌을 보장한다. 알고리즘을 풀 때는 화면에 바로 보이는 것이 중요하지 않기 때문에
성능을 위해서 cin 과 cout의 묶음을 풀어준다.
결론
알고리즘을 풀 때는 보통 싱글 쓰레드 환경이기 때문에 ios_base::sync_with_stdio(false); 코드를 추가해줘도
결과에 영향이 없고 C와 C++의 버퍼를 분리하기 때문에 속도가 빨라진다.
기본적으로 cin으로 읽을 때 먼저 출력 버퍼를 비우는데,
마찬가지로 알고리즘을 풀 때는 화면에 바로 보이는 것이 중요하지 않다.
따라서, 입력과 출력을 여러 번 번갈아가며 반복해야 하는 경우 필수적으로 cin.tie(null); 코드를 추가하여
cout과 cin의 묶음을 풀어줘야한다.
'c & c++ > c++ 기초 개념' 카테고리의 다른 글
맥에서 bits/stdc++.h 헤더 사용법 (0) | 2023.05.03 |
---|---|
형(타입, type) (0) | 2023.01.18 |
입출력 (0) | 2023.01.18 |
댓글