programing tip

ios_base :: sync_with_stdio (false);의 중요성

itbloger 2020. 8. 15. 08:49
반응형

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/printfC ++ 프로그램에서 값이 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 작업 전에 한 스트림이 자동으로 플러시되도록합니다.

기본적으로 cincout합리적인 사용자 상호 작용을 보장하기 위해 연결됩니다 . 예를 들면 :

std::cout << "Enter name:";
std::cin >> name;

경우 cincout연결되어, 당신은 출력이 사용자로부터 프로그램 프롬프트에 입력하기 전에 (콘솔에 즉, 눈에 보이는) 플러시 할 것으로 예상 할 수있다. 스트림을 풀면 프로그램은 사용자가 이름을 입력 할 때까지 대기하는 것을 차단할 수 있지만 "이름 입력"메시지는 아직 표시되지 않습니다 ( cout기본적으로 버퍼링 되기 때문에 출력은 요청시에만 또는 콘솔에 표시됩니다. 버퍼가 가득 참).

따라서 cin에서 풀면 입력을 기대하기 전에 무언가를 표시 할 때마다 수동으로 cout플러시 cout해야합니다 cin.

결론적으로, 그들 각각이 무엇을하는지 알고 결과를 이해 한 다음 속도 향상 가능한 부작용 을 정말로 원하거나 필요한지 결정하십시오 .


이것은 C 및 C ++ 세계의 IO를 동기화하는 것입니다. 동기화하면 모든 IO의 순서가 예상 한 것과 정확히 일치 함을 보장 할 수 있습니다. 일반적으로 문제는 두 세계가 동일한 버퍼를 공유하도록 동기화하여 문제를 일으키는 IO의 버퍼링입니다. 예를 들면 cout << "Hello"; printf("World"); cout << "Ciao";; 동기화하지 않으면 얻을 수 HelloCiaoWorld있는지 HelloWorldCiao또는 CiaoHelloWorld...

tieC ++ 세계의 IO 채널이 서로 연결 되어 있음을 보장 할 수 있습니다. 예를 들어 입력이 발생하기 전에 모든 출력이 플러시되었음을 의미합니다 cout << "What's your name ?"; cin >> name;.

항상 C 또는 C ++ IO를 혼합 할 수 있지만 합리적인 동작을 원한다면 두 세계를 모두 동기화해야합니다. 일반적으로 C로 프로그래밍하는 경우 C stdio를 사용하고 C ++로 프로그래밍하는 경우 스트림을 사용하는 경우 혼합하지 않는 것이 좋습니다. 그러나 기존 C 라이브러리를 C ++ 코드로 혼합하고 싶을 수 있으며,이 경우 둘 다 동기화해야합니다.


사용 ios_base::sync_with_stdio(false);하면 CC++스트림 을 분리하는 데 충분합니다 . Langer와 Kreft의 Standard C ++ IOStreams and Locales 에서 이에 대한 논의를 찾을 수 있습니다 . 그들은 이것이 어떻게 작동하는지 구현에 따라 정의된다는 점에 주목합니다.

cin.tie(NULL)호출은에 활동 사이에 디커플링 요청하는 것 같습니다 cincout. 왜 이것을 다른 최적화와 함께 사용하면 충돌이 발생하는지 설명 할 수 없습니다. 언급했듯이 제공 한 링크가 잘못되었으므로 여기에 추측이 없습니다.

참고 URL : https://stackoverflow.com/questions/31162367/significance-of-ios-basesync-with-stdiofalse-cin-tienull

반응형