C++ 레퍼런스

sz L·2023년 10월 16일
0

C++

목록 보기
38/40

ios_base::sync_with_stdio(false);
cin.tie(NULL);

C++로 알고리즘을 실행할 때 실행 속도를 높이기 위해 위와 같은 구문을 작성한다.

ios_base::sync_with_stdio(false);

ios_base::sync_with_stdio() 구문은 c의 stdio와 cpp의 iostream을 동기화 시켜주는 역할을 함.

이 때 iostream과 stdio의 버퍼를 모두 사용하기 때문에 딜레이가 발생한다.

따라서 false 시켜줌으로써 동기화를 비활성화 시켜 실행속도가 빨라진다.

동기화 된 C++ 버퍼는 thread-safe 하기 때문에 모든 IO의 순서가 예상과 정확히 일치됨을 알 수 있지만 이 코드를 추가하게 되면 동기화가 비활성화 되기 때문에 멀티 쓰레드 환경에선 출력 순서를 보장할 수 없게 된다.


cin.tie(NULL);

cin.tie(NULL); 코드는 cin과 cout의 묶음을 풀어준다.

기본적으로 cin과 cout은 묶여있고 묶여있는 스트림들은 한 스트림이 다른 스트림에서 각 IO 작업을 진행하기 전에 자동으로 버퍼를 비워줌을 보장한다.

cout << "이름을 입력하세요: ";
cin >> name;

위 구문은 cincout이 묶여있기 때문에 이름 입력 전에 "이름을 입력하세요: "라는 구문이 먼저 나오게 된다.

cin.tie(NULL); 를 추가하게 되면 cincout의 묶음이 풀리면서 이름의 입력을 먼저 받게되는 경우가 발생할 수도 있다.

이는 cout이 기본적으로 먼저 버퍼에 추가되고 바로 지워지지 않기 때문이다.
(출력 명령을 내리거나 버퍼가 가득 찼을 경우에만 버퍼를 비운다)

따라서 "이름을 입력하세요: " 를 이름 입력 전에 띄우고 싶다면 cout으로 "이름을 입력하세요: "를 출력할 때 버퍼를 비워줘야 한다.


결론

기본적으로 cin으로 읽을 때 먼저 출력 버퍼를 비우는데, 마찬가지로 알고리즘을 풀 때는 화면에 바로 보이는 것이 중요하지 않습니다. 따라서, 입력과 출력을 여러 번 번갈아가며 반복해야 하는 경우 필수적으로 cin.tie(null); 코드를 추가하여 cout과 cin의 묶음을 풀어줘야 합니다.

profile
가랑비는 맞는다 하지만 폭풍은 내 것이야

0개의 댓글