[C++] ios_base::sync_with_stdio(false)와 cin.tie(NULL)

Yunsang You·2022년 2월 8일
1

오늘은 C++로 백준 15552번을 풀면서 부딪혔던 난관...
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의 버퍼와 병행 사용은 불가하다.
    그러나 사용하는 버퍼의 수가 줄었기 때문에 실행 속도는 빨라지게 된다.

  • 버퍼가 분리되었기 때문에 cin과 C의 scanf, gets, getchar 등을 같이 사용하면 안 되고 cout과 C의 printf, puts, putchar 등을 같이 사용하면 안 된다.


📌 버퍼 : 입력과 출력을 조금 더 효율적으로 할 수 있게 해주는 임시 메모리 공간

  • 버퍼를 사용하지 않은 입력 ➡ 키보드의 입력이 키를 누르는 즉시 바로 프로그램에 전달

  • 버퍼를 사용한 입력 ⬇⬇
    (1) 키보드의 입력이 있을 때 마다 한 문자씩 버퍼로 전송
    (2) 버퍼가 가득 차거나, 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달



📃 cin.tie(NULL)

  • 원래 coutcin 은 묶여있다. 때문에 다른 스트림이 작업 요청할 경우 자동적으로 버퍼를 flush하는 것을 보장한다.
    입출력이 반복되면 일일이 버퍼를 지워주느라 시간이 오래 걸릴 것이다.
    이 때 cin.tie(NULL) 을 이용하여 cincout 의 묶음을 풀어주면 시간을 단축시킬 수 있다.

입출력 순서를 보장 받을 수 없다는 단점이 존재한다.


+ endl에 대하여

  • endl 은 개행의 역할만 하는 것이 아니라 버퍼를 flush하는 역할도 하기 때문에
    알고리즘을 풀 때는 endl 대신 "\n" 을 이용해 개행하는 것이 바람직하다.


👏 마무리하며

앞으로 coutcin 을 이용하여 알고리즘을 풀 때는 시간 단축을 위해
ios_base::sync_with_stdio(false)cin.tie(NULL) 을 이용하도록 하자.
추가로 "\n" 을 이용하는 것도 잊지 않기!

profile
c++ 마스터이고 싶은 것.

1개의 댓글

comment-user-thumbnail
2024년 10월 31일

오오오오

답글 달기