ios_base::sync_with_stido(0); cin.tie(0); cout.tie(0);
이는 기본적으로 입출력 할때에 C++의 cin, cout의 경우 C의 printf,scanf보다 느리기에 이 입출력의 속도를 빠르게 하기 위해서/C와 속도를 비슷하게 되기 위해 쓰게된다고 알게되는 함수이다.
이번에는 이 함수들에 대해 알아볼 것이다.
std::ios_base::sync_with_stdio(bool _Newsync = true);
맨 뒤에 들어가는 숫자는 bool값으로 즉 true, false를 나타낸다. true가 기본값이다.
이 이유는 output 데이터가 엉키지 않고 올바른 순서로 처리되도록 하기 위해 동기화를 활성화하기 때문이다.
C++ 표준 스트림들이 C 표준 스트림들과 각각의 입출력 연산 후에 동기화 할지 여부를 설정한다.
ios_base::sync_with_stido(true);
이 코드가 위 코드와 같이 true인 경우에는(기본값) C의 scanf와 printf, gets, puts등 그리고 C++의 cin과 cout 등의 출력 버퍼를 공유와 동기한다.
그래서 이 상태에서는 C++의 cin이나 cout이 호출될 때, C의 입출력 버퍼와 상태를 확인하는 추가 작업이 필요하다.
ios_base::sync_with_stido(false);
하지만 이 값을 false로 바꾸어 위 코드와 같이 바꾸면 동기화를 끊으면 이런 추가 작업이 제거되어 독립적으로 작동하기 때문에 C++ 입출력이 더 빨라지며, 이는, 데이터 입출력 양이 많을수록 속도의 차이가 크게 난다.
동기화를 끊기 때문에 C 표준 입출력과 C++ 표준 입출력의 순서가 보장되지 않게된다.
따라서 이 코드를 사용하는 경우 C와 C++이 두 언어의 입출력 방법을 혼용하지않아야한다.
stido뒤에 넣는 false값의 경우 false를 나타내면 되므로 false 대신 0을 써서 ios_base::sync_with_stido(0);도 가능하다.
std::cin.tie(false);
C++에서 cin과 cout은 기본적으로 서로 연결되어 있다. 하지만 cin.tie(0);을 사용하면 cin을 호출하기 전에, cout의 출력 버퍼를 강제로 비운다. 이렇게 하면, cin을 호출하더라도 출력 버퍼를 비우는 동작이 생략되기에 속도가 더 빨라지게된다.
tie뒤에 넣는 false 값의 경우 0, NULL, nullptr를 쓰기도 한다.
std::cout.tie(false);
cin.tie(0);과 같이 짝궁처럼 따라다니는 코드이지만 실제로 영향을 미치지 않는다.
기본적 nullptr이기 때문이다. 즉, cout은 기본적으로 다른 스트림과 연결되어 있지 않다.
이 함수는 cout을 다른 스트림과 연결하거나 연결을 끊는 역할을 한다.
그래서 기본적으로 이 3 함수에 대한 존재를 알게 된 후에 쓰는 사람들의 코드를 보면
#include <iostream>
typedef long long int llint;
using namespace std;
int n,ar[6], t, p;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 0; i < 5; i++) {
cin >>ar[i];
}
cin >> t >> p;
}
이렇거나
#include <iostream>
typedef long long int llint;
using namespace std;
int n,ar[6], t, p;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i < 5; i++) {
cin >>ar[i];
}
cin >> t >> p;
}
이런데 cout.tie(0)의 코드의 존재가 없을 때도 있는 이유는 cout.tie(0)은 있어도 효능이 없다인 것이 답인 것이다.
추가로 이 글을 읽으려 온 사람은 C++의 입출력을 빠르게 하기 위해서 관심이 있는 사람일 것이라 생각하기에 추가로 말하자면
C++로 쓰는 cout<<endl의 경우 cout<<'\n'가 더 속도가 빠르기에 cout<<endl보단 cout<<'\n'를 쓰는 것이 좋다.
'coding Tips & Tricks' 카테고리의 다른 글
coding tip) 웹으로 코딩 잠깐 작업하기 (0) | 2024.12.02 |
---|---|
python) 백준 python3 vs PyPy3 (0) | 2024.11.26 |