문제자체는 A+B를 출력하지만 하면 되는 단순한 문제이지만, 빠른 입출력이라니? 했다.
cin, cout
기본적으로 C++에서는 cin과 cout으로 입출력을 한다.
근데 문제에서는
라고 친절하게 알려준다.
cin.tie(NULL)
이거 보자마자 든 생각 : C++은 nullptr아닌가? (맞다 nullptr가능)
기본적으로 입력과 출력은 연결되어있다. 즉, cin과 cout 스트림이 서로 연결되어있는데 이게 빠른 입출력이 필요한 상황에서 문제가 된다.
왜냐하면, cin과 cout처럼 엮여있는 경우, 한 스트림이 다른 스트림에서 각자의 작업을 진행하기 전에 자동으로 다른 스트림의 버퍼를 비워주는 기능이 있다.
(마치 서로 아끼는 연인 사이가 출근하기전에 미리 다른 사람의 안부를 묻는 느낌? 서로를 보살피는 느낌?)
왜, 그래서 입력받는 창에 그냥 입력받기 보다 "이름을 입력하세요 : " 이런식으로 옆에 띄워주잖아. 그게 다 이런이유에서..
그래서 cin.tie(NULL)을 사용해서 cin과 cout의 묶음을 풀어준다. 그러면 버퍼를 비우는 기능 자체를 삭제할 수 있어서 시간단축이 된다.
endl
문제에서 endl 대신 "\n"을 사용하라고 되어있다.
이건 endl은 줄바꿈 기능 + cin처럼 버퍼를 초기화 하는 기능이 있기 때문이다.
sync_with_stdio(false)
더 정확히 작성하면 이렇게 작성한다.
ios_base::sync_with_stdio(false);
이건 c의 stdio와 c++의 iostream의 동기화를 끊는 구문이다.(true면 연결, 이게 기본)
iostream과 stdio는 각자 버퍼를 사용하는데, 둘이 동기화되어있으면 당연히 딜레이가 발생할 수밖에 없다. 그래서 동기화를 끊어서, c++만의 독자적인 버퍼를 생성하고, 사용하는 버퍼의 수를 줄였기때문에 실행시간이 단축된다.
다만, c의 버퍼를 끊어냈기에 c의 버퍼와 병행해서 사용할 수 없어서 c++의 cin등과 c의 scanf, puts putchar이런걸 사용할 수 없다. (한마디로 c와 c++을 섞어서 사용 못함.)
또한, 동기화를 끊어냈다 = 동기화를 비활성했다 이거의 가장큰 문제점은???? 멀티쓰레드 환경.
대부분 코테는 싱글 쓰레드 환경이(...겠지?)기 때문에 상관은 없지만, 멀티쓰레드 환경이라면 출력 순서가 뒤죽박죽이 될 수 있다.
참고 링크
'하고싶은거 > C++' 카테고리의 다른 글
싱크홀 메우기 (업데이트중) (1) | 2024.04.17 |
---|---|
타입 변환 연산자 (0) | 2024.04.13 |
스마트 포인터 (0) | 2024.04.12 |
#개발 #게임 #일상
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!