ios_base의 중요성::sync_with_stdio(false), cin.tie(NULL);
다음을 포함시키는 것의 의미는 무엇입니까?
ios_base::sync_with_stdio(false);
cin.tie(NULL);
C++ 프로그램에서는요?
제 테스트에서는 실행 시간이 단축됩니다만, 이것을 포함시켜 걱정해야 할 테스트 케이스가 있습니까?
두 개의 문장은 항상 함께 있어야 합니까?아니면 첫 번째 문장으로 충분합니까?즉, 무시하는 것으로 충분합니까?cin.tie(NULL)
?
또한 C와 C++ 명령어의 값이 다음과 같이 설정되어 있는 경우 동시에 C와 C++ 명령어를 사용할 수 있습니까?false
?
https://www.codechef.com/viewsolution/7316085
위의 코드는 정상적으로 동작했습니다.scanf/printf
C++ 프로그램에서 값을 로서true
. 이 경우 분할 오류가 발생했습니다.이에 대한 가능한 설명은 무엇입니까?
2개의 콜은 퍼포먼스와는 무관한 다른 의미를 가지고 있습니다.실행 시간을 단축하는 것은 부작용에 불과합니다.최적화처럼 보인다고 해서 모든 프로그램에 맹목적으로 포함시켜서는 안 되며 각각의 기능을 이해해야 합니다.
ios_base::sync_with_stdio(false);
이것에 의해, C 와 C++ 표준 스트림간의 동기화가 디세블이 됩니다.기본적으로는 모든 표준 스트림이 동기화되므로 실제로 C- 및 C++ 스타일의 I/O를 혼합하여 적절한 예상 결과를 얻을 수 있습니다.동기화를 디세블로 하면 C++ 스트림은 독자적인 버퍼를 가질 수 있기 때문에 C- 스타일과 C++ 스타일의 I/O를 혼재시키는 것이 중요합니다.
동기화된 C++ 스트림은 스레드 안전하다는 점도 유의하십시오(다른 스레드로부터의 출력은 인터리브 할 수 있지만 데이터 레이스는 없습니다).
cin.tie(NULL);
이 언티즈cin
부터cout
. 스트림을 묶으면 다른 스트림에서 각 I/O 작업을 수행하기 전에 한 스트림이 자동으로 플러시됩니다.
디폴트cin
에 관련되다cout
사용자의 합리적인 상호작용을 보증합니다.예를 들어 다음과 같습니다.
std::cout << "Enter name:";
std::cin >> name;
한다면cin
그리고.cout
이 경우 프로그램이 사용자로부터의 입력을 요구하기 전에 출력이 플러시(콘솔에 표시됨)될 것으로 예상할 수 있습니다.스트림을 풀면 프로그램에서 사용자의 이름을 입력할 때까지 대기하는 것을 차단할 수 있지만 "이름 입력" 메시지는 아직 표시되지 않습니다(이 때문에).cout
는 디폴트로 버퍼링되어 있습니다.출력 플래시/플래시는 요구 시 또는 버퍼가 꽉 찼을 때만 콘솔에서 이루어집니다).
그래서 네가 풀면cin
부터cout
, 반드시 세정해야 합니다.cout
입력을 예상하기 전에 무언가를 표시하려는 경우 항상 수동으로cin
.
결론적으로, 그들 각각이 무엇을 하는지 알고, 그 결과를 이해한 후, 당신이 속도 향상의 가능한 부작용을 정말 원하는지 혹은 필요로 하는지를 결정하세요.
이는 C와 C++ 월드의 IO를 동기화하기 위한 것입니다.동기화하면 모든 IO의 순서가 예상과 완전히 일치함을 보증할 수 있습니다.일반적으로 문제는 문제의 원인이 되는 IO 버퍼링입니다.동기를 통해 양쪽 월드가 동일한 버퍼를 공유할 수 있습니다.예를들면cout << "Hello"; printf("World"); cout << "Ciao";
; 동기화하지 않으면 얻을 수 있을지 알 수 없습니다.HelloCiaoWorld
또는HelloWorldCiao
또는WorldHelloCiao
...
tie
를 사용하면 C++ 월드의 IO 채널이 서로 연결되어 있음을 보증할 수 있습니다.예를 들어 입력이 발생하기 전에 모든 출력이 플러시됩니다(에 대해 생각해 보십시오).cout << "What's your name ?"; cin >> name;
).
언제든지 C 또는 C++ IO를 혼합할 수 있지만 적절한 동작을 원할 경우 두 월드를 동기화해야 합니다.일반적으로 C에서 프로그램할 경우 C stdio를 사용하고 C++에서 프로그램할 경우 스트림을 사용하는 것은 권장되지 않습니다.다만, 기존의 C 라이브러리를 C++ 코드에 혼재시키고 싶은 경우가 있습니다.이 경우, 양쪽을 동기화할 필요가 있습니다.
cin 입력을 빠르게 하기 위한 일반적인 작업입니다.
간단히 설명하자면, 첫 번째 행은 cin 스트림과 c-style stdio 도구(scanf 또는 gets 등) 간의 버퍼 동기화를 끄므로 cin은 더 빨리 동작하지만 stdio 도구와 동시에 사용할 수 없습니다.
두 번째 행은 cout에서 cin의 연결을 해제합니다.기본적으로는 cout 버퍼는 cin에서 읽을 때마다 플러시됩니다.그리고 작은 것을 반복해서 읽고 작은 것을 여러 번 쓸 때는 느릴 수 있다.따라서 회선은 이 동기화를 끕니다(문자 그대로 cout이 아닌 null에 cin을 연결함으로써).
좋은 답변들이 많이 있어요.나는 단지 흐름을 분리하는 것에 대한 작은 메모를 덧붙이고 싶다.
cin.tie(NULL);
CodeChef 플랫폼과 스트림을 분리하는 동안 문제가 발생했습니다.코드를 제출했을 때 플랫폼 응답은 "오답"이었지만 스트림을 묶고 테스트를 한 후였습니다.됐다.
따라서 스트림을 해제하려면 출력 스트림을 플러시해야 합니다.
사용.ios_base::sync_with_stdio(false);
를 분리하기에 충분합니다.C
그리고.C++
스트림입니다.이에 대한 자세한 내용은 Langer와 Creft의 Standard C++ IOStreams와 Locales에서 확인할 수 있습니다.이들은 이것이 어떻게 작동하는지가 구현에 정의된다는 점에 주목합니다.
그cin.tie(NULL)
콜이 액티비티간의 디커플링을 요구하고 있는 것 같다.cin
그리고.cout
이것을 다른 최적화와 함께 사용하면 크래시가 발생하는 이유를 설명할 수 없습니다.이미 언급했듯이, 당신이 제공한 링크는 불량하기 때문에, 여기에 투기는 없습니다.
언급URL : https://stackoverflow.com/questions/31162367/significance-of-ios-basesync-with-stdiofalse-cin-tienull
'programing' 카테고리의 다른 글
누가 유니언을 쓰겠어?C-only 시절의 유물인가요? (0) | 2022.07.28 |
---|---|
String에서 %를 이스케이프하는 방법.포맷? (0) | 2022.07.28 |
Vue-loader 구문 오류:js 파일에서 구성 요소를 가져올 때 예기치 않은 토큰 {이(가) 발생했습니다. (0) | 2022.07.28 |
감시 어레이에서 인덱스를 취득하다 (0) | 2022.07.28 |
Vue.js 범용 다이내믹 컴포넌트 렌더링 (0) | 2022.07.28 |