공부/c++

[c++] ios::sync_with_stdio, cin.tie, cout.tie

narmeee 2023. 4. 27. 11:19

백준을 풀다가 시간제한이 발생했는데 해결 방법을 찾다가 아래 코드를 넣어주니까 해결됐었다.

tie? sync? 가 뭐길래!!

ios::sync_with_stdio(false)
cin.tie(nullptr)
cout.tie(nullptr)

sync_with_stdio(bool)

C와 C++ 표준 stream의 동기화 여부를 설정한다.

stream이란 프로그램과 입출력을 하는 단말기 사이에 연결된 통로이다.

일반적으로 C와 C++의 stream은 동기화되어 있다. 한 코드 안에서 C와 C++ 스타일을 혼용하더라도 정상적으로 입출력이 가능한 이유이다. 

동기화를 해제한다면 C와 C++은 각각 독립적인 버퍼를 가지게 된다. 동기화를 한하기 때문에 연산이 줄어들게 된다.

이게 바로 ios::sync_with_stdio(false)를 했을 때 속도가 향상되는 이유이다. 

하지만 저마다의 버퍼를 사용하기 때문에 혼용했을때 순서를 보장하지 않게 된다.

 

#include <iostream>
#include <cstdio>

int main(){
    std::ios::sync_with_stdio(false);

    std::cout << "a\n";
    std::printf("c\n");
    std::cout << "b\n";

    return 0;
}

a c b 순으로 출력될것 같지만 아니다.

읭...?

cin.tie(nullptr), cout.tie(nullptr)

tie란 cin과 cout을 묶어준다는 의미이다. tie(nullptr)을 하게 되면 묶지 않는다는 뜻이다.

묶어준다는 건 두 개의 stream이 동기화되어 한 스트림에서 다른 스트림이 작업을 요청하면 내용을 flush 한다는 거다.

입출력이 많이 일어나는 문제에서 cin과 cout을 묶지 않기 때문에 속도가 빨라지는 효과를 볼 수 있는 것이다.

묶지 않는다는 것은 입출력의 순서가 절차적으로 시행되지 않을 수도 있는 것이기도 하다.

    std::cout << "input : \n";
    std::cin >> input;

 

"input : " 이 출력되기 전에 input을 받게 될 수도 있다..!

 

결론

순서를 보장하지 않는다는 것은 문제가 될 수 있다. 알고리즘 문제를 풀 때만 사용하자 : )