새소식

💻 Programming (프로그래밍)/C++

[C++] cin, cout 최적화

  • -

Q) cin, cout 최적화 방법은?

ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

 

 

Q) 위의 방법이 단순히 최적화 시켜주는 구문일까요?

A) 대답은 NO!! 제대로 알고 씁시다.

 

 

Q) 그렇다면 위의 코드의 작동원리는?

 ios::sync_with_stdio(false);

 

C++ 컴파일러는, c스타일의 입출력까지 기본값으로 혼용하여 사용합니다. 

위의 구문은, c스타일의 입출력의 synchronization을 false하겠다는 의미로, 동기화를 꺼줘서 

 

독립된 자신만의 버퍼를 갖습니다. 따라서 속도가 빨라지는 것이죠.

 

하지만 쓰레드 사용 시 여러쓰레드가 동시에 입출력에 접근하는 경우가 생겨, 불안정한 결과를 초래할 수 있습니다!

 

 

Q) cin.tie(NULL), cout.tie(NULL) 는?

A) cin과 cout이 묶여 있기에, 묶음을 풀어주는 코드입니다.

cin.tie(NULL)은 cin이 cout과의 묶음에 풀리게 (실상 cout에서 cin에 대한 묶음이 풀립니다.)

cout.tie(NULL)은 cout이 cin과의 묶임에 풀리게! (이것도 실상 cin에 대한 cout의 묶음이 풀립니다.)

 

기존의 default 값으로 cin.tie(true), cout.tie(true) 가 되어있어 , 모든 입력 출력의 순서가 , 동일한 버퍼를 공유하게 됩니다. 따라서 cin, cout순서대로 입력 출력이 되는 듯합니다.

 

 

Q) cout << endl 보다 cout << '\n' 이 더 빠르다구요?

A) 네 맞아요, endl는 일반적으로 스트림(출력 버퍼)를 플러시하여 실행시켜 더 느립니다.

endl -> 새 줄을 삽입후, 스트림(출력 버퍼)를 플러시합니다. (하지만 메모리를 차지하지 않습니다.)

'\n' -> 새 줄만 삽입합니다. (1바이트의 메모리를 차지합니다.)

 

따라서 스트림의 플러싱이 필요하지 않는한!, '\n'를 애용해야겠습니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.