ios_base :: sync_with_stdio (false);의 중요성 cin.tie (NULL);
포함의 의미는 무엇입니까
ios_base::sync_with_stdio(false);
cin.tie(NULL);
C ++ 프로그램에서?
내 테스트에서는 실행 시간이 빨라지지만 이것을 포함하여 걱정해야 할 테스트 케이스가 있습니까?
두 문장이 항상 함께 있어야합니까, 아니면 첫 번째 문장이 충분 cin.tie(NULL)
합니까 , 즉 무시 합니까?
또한 값이 false
? 로 설정된 경우 C 및 C ++ 명령을 동시에 사용할 수 있습니까?
https://www.codechef.com/viewsolution/7316085
위의 코드는 scanf/printf
C ++ 프로그램에서 값이 true
. 이 경우 분할 오류가 발생했습니다. 이에 대한 가능한 설명은 무엇일까요?
두 호출은 성능과 관련이없는 다른 의미를 가지고 있습니다. 사실 은 실행 시간을 속도는 (또는 수 있습니다 단지 부작용). 각각이 무엇을하는지 이해해야하며 최적화처럼 보이기 때문에 모든 프로그램에 맹목적으로 포함하지 않아야합니다.
ios_base::sync_with_stdio(false);
이렇게하면 C 및 C ++ 표준 스트림 간의 동기화가 비활성화됩니다. 기본적으로 모든 표준 스트림이 동기화되어 실제로 C 및 C ++ 스타일 I / O를 혼합하여 합리적이고 예상되는 결과를 얻을 수 있습니다. 동기화를 비활성화하면 C ++ 스트림에 자체 독립 버퍼가 허용되므로 C 및 C ++ 스타일 I / O를 혼합하는 것이 모험이됩니다.
또한 동기화 된 C ++ 스트림은 스레드로부터 안전합니다 (다른 스레드의 출력은 인터리브 될 수 있지만 데이터 경합은 발생하지 않음).
cin.tie(NULL);
이 unties 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
또는 CiaoHelloWorld
...
tie
C ++ 세계의 IO 채널이 서로 연결 되어 있음을 보장 할 수 있습니다. 예를 들어 입력이 발생하기 전에 모든 출력이 플러시되었음을 의미합니다 cout << "What's your name ?"; cin >> name;
.
항상 C 또는 C ++ IO를 혼합 할 수 있지만 합리적인 동작을 원한다면 두 세계를 모두 동기화해야합니다. 일반적으로 C로 프로그래밍하는 경우 C stdio를 사용하고 C ++로 프로그래밍하는 경우 스트림을 사용하는 경우 혼합하지 않는 것이 좋습니다. 그러나 기존 C 라이브러리를 C ++ 코드로 혼합하고 싶을 수 있으며,이 경우 둘 다 동기화해야합니다.
사용 ios_base::sync_with_stdio(false);
하면 C
및 C++
스트림 을 분리하는 데 충분합니다 . Langer와 Kreft의 Standard C ++ IOStreams and Locales 에서 이에 대한 논의를 찾을 수 있습니다 . 그들은 이것이 어떻게 작동하는지 구현에 따라 정의된다는 점에 주목합니다.
cin.tie(NULL)
호출은에 활동 사이에 디커플링 요청하는 것 같습니다 cin
및 cout
. 왜 이것을 다른 최적화와 함께 사용하면 충돌이 발생하는지 설명 할 수 없습니다. 언급했듯이 제공 한 링크가 잘못되었으므로 여기에 추측이 없습니다.
'programing tip' 카테고리의 다른 글
명령 줄에서 Visual Studio 프로젝트를 어떻게 컴파일합니까? (0) | 2020.08.15 |
---|---|
IE에서 작동하지 않는 요소에 초기 너비 사용 (0) | 2020.08.15 |
Android에 새 네트워크 베어러 추가 (0) | 2020.08.14 |
TPM (Trusted Platform Module)을 사용하여 바이트를 암호화하는 방법 (0) | 2020.08.14 |
Hibernate, @SequenceGenerator 및 assignmentSize (0) | 2020.08.14 |