<aside>
💡 이 포스트에서는 C++에서 사용되는 std::cout
, std::cin
과 기존 C에서 사용되는 printf()
, scanf()
함수를 비교 및 분석하고, 이들을 사용하는 자세한 방법을 다룬다
</aside>
std::cin
과 std::cout
에 비해서 scanf()
, printf()
가 훨씬 빠르다scanf()
와 printf()
함수를 사용하기 위해서는 C에서와 마찬가지로 #include <stdio.h>
선언이 필요하다std::cin
과 std::cout
이 C의 표준 입출력과 동기적(synchronized)으로 작동하는데, 동기화를 해제하고 가속하기 위해서는 ios_base::sync_with_stdio(false);
과 cin.tie(NULL);
을 호출하면 속도가 비슷해진다std::endl
대신에 "\\n"
을 사용하면 flush(버퍼를 비우는 역할)가 불필요하게 호출되지 않아 속도가 많이 줄어든다C++로 알고리즘을 풀 때, 실행 속도를 높이기 위해서는 아래와 같은 구문을 작성할 수 있다
ios_base::sync_with_stdio(false);
cin.tie(null);
ios_base::sync_with_stdio
구문은 C의 stdio와 C++의 iostream을 동기화시켜주는 역할을 수행함
이때, iostream과 stdio의 버퍼를 모두 사용하기 때문에 싱크를 맞추기 위해서는 딜레이가 발생하게 됨
이 상태를 false
로 지정하여 동기화를 비활성화시킴
cin.tie(null);
구문은 cin과 cout의 바인딩을 풀어주는 역할을 함
기본적으로 cin과 cout은 묶여있고, 묶여있는 스트림들은 한 스트림이 다른 스트림에서 각 I/O 작업을 진행하기 전에 자동으로 버퍼를 비워줌을 보장함
std::cout << "Type your name: ";
std::cin >> name;
Type your name:
구문이 먼저 출력됨cin.tie(null);
코드를 추가하면 cin과 cout의 묶음이 풀리면서 Type your name:
구문이 출력되지 않은 상태에서 먼저 이름을 입력받는 경우가 발생할 수 있음cin.tie(null);
코드를 추가했고 name
을 입력받기 전에 구문을 먼저 출력하고 싶다면, cout
으로 출력할 때 버퍼를 비워줘야 함scanf()
나 printf()
와 같은 C의 표준 입출력을 사용할 수 없게 됨false
가 되었을 때는 동기화가 비활성화되어 멀티 쓰레딩 환경에서 출력 순서를 보장할 수 없게 됨std::cin
과 C의 scanf()
, gets()
, getchar()
등을 같이 사용하면 안되며, cout
과 C의 printf()
, puts()
, putchar()
등을 같이 사용하면 엉뚱한 결과가 나올 확률이 높음