특별편) ios_base::sync_with_stdio(null), cin.tie(null)에 관하여

경지현·2023년 8월 10일

algorithm_study

목록 보기
18/21

c++로 알고리즘 문제를 풀면서 속도를 높이기 위해서는 밑에 구문들을 추가해야 한다는 것을 알게 되었다. 그리고 그 이유를 알아보니... 이러했다.

  1. ios_base::sync_with_stdio(null);

    stdio버퍼(c전용 버퍼)와 c++버퍼를 동기화해주는 함수. 매개변수에 0이나 null을 넣으면, 비동기화를 해서 실행 속도가 빨라지게 된다.
    ❗️단점: multi thread환경에서는 버퍼가 비동기화 된 상태기 때문에 출력 순서가 엉망이 될 수 있다. stdio 함수인 printf, puts, putchar, scanf등을 cin, cout과 함께 사용할 수 없다.

  2. cin.tie(null);

    위 구문과는 달리 tie라는 게 뭔지 이해가 잘 안가서 여러 블로그와 사이트들을 참고해서 공부해본 결과, tie라는 건, 해당 stream이 시작 되기 전에 묶여있는 stream의 버퍼가 비워지는 기능을 의미한다.
    예를 들어서,
    라는 코드가 있다고 할때, cin이 cout에 tie되어 있지 않다면, 사용자는 please enter your age: 라는 문구를 보지 못하고 따라서 입력값도 넣지 않는다. 이렇게 되면, 입력과 출력 모두 하지 않는 무의미한 상태가 된다.
    1 std::cout << "Please enter your age: ";
    2 int age;
    3 std::cin >> age;

    이런 경우를 방지하기 위해서 tie라는 기능을 사용한다.
    하지만, 입력값을 받을 때마다 output stream을 매번 flush시키면 딜레이가 발생하고 우리는 속도를 향상시키기 위해 이 tie를 풀어주는 거다.

    ❓cout.tie(null)

    블로그들이 가끔 이 구문을 추가하는 경우가 있는데, cout은 원래 null에 tie되어 있으므로 의미가 없는 구문이라고 한다.

profile
그냥 사람

0개의 댓글