티스토리 뷰

C++

[C++] std::ios_base::sync_with_stdio(false);

그레고리 2022. 2. 16. 20:56
728x90

● std::ios_base::sync_with_stdio(false);의 의미 

C++의 표준 스트림들이 C의 표준 스크림들과 동기화를 할 것인지 설정해준다. 

std::ios_base::sync_with_stdio(false);

 

 

 설명

C++의 표준 스트림들이 C의 표준 스크림들은 기본적으로 서로 동기화 되어있다. 

즉, C++ 스트림이 자신의 버퍼를 사용하지 않고 C 스트림의 버퍼를 사용할 수 있다. 그렇기 때문에 우리가 아는 C언어의 입출력함수를 C++에서 사용해도 별 문제 없이 동작하는 것이다.

 

동기화를 끄면

- 만약 동기화를 끈 상태에서 C의 입출력함수와 C++의 입출력함수를 섞어서 사용하면 코드의 순서와는 다르게 결과가 섞여서 출력될 수 있다. (C++은 자기 스트림내의 버퍼로 데이터를 이동시키면서 연산을 수행하고, C도 자기 스트림 내의 버퍼로 데이터를 이동시키면서 연산을 수행하기 때문) 따라서 동기화를 하지 않을 경우, 표준 스트림을 사용하는 함수는 C++과 C함수를 섞어 쓰지 않는 것이 좋다. (ex. 출력으로 cout을 쓰면 printf는 쓰지 않는 것이 좋다. )

- 동기화를 끄면 C++ 의 표준 스트림들은 각각의 입출력 연산을 할 때 각각의 스트림내의 버퍼를 사용하게 될 것이다. 그러면 입출력 연산 속도는 크게 향상될 것이다. 

 

동기화를 하지 않았을 때 순서가 섞인다는 것을 예시를 들어서 설명하자면

#include <iostream>

int main(){
    std::ios_base::sync_with_stdio(false); 

    std::cout << "C++'s cout 1\n";
    std::printf(" C's printf\n");
    std::cout << "C++'s cout 2\n";

    return 0;
}

다음과 같은 코드가 있을 때, 우리가 생각했을 때는 출력값이 

C++'s cout 1
C's printf
C++'s cout 2

이렇게 차례대로 나와야한다. 그러나 동기화를 끄면 C의 출력 함수인 printf의 데이터 "C's printf" 라는 문자열은 C 출력스트림 내의 버퍼를 통해 전달되고, 처리된다. 그리고 C++의 출력 함수인 cout의 데이터 "C++'s cout1"과 "C++'s cout2"는 C++ 출력스트림 내의 버퍼를 통해 전달되고, 처리된다. 따라서 같은 스트림을 사용하는  "C++'s cout1"와  "C++'s cout2"는 당연히 코드의 순서대로 1이 먼저, 그다음에 2가 출력되겠지만 C 스트림버퍼를 사용하는  "C's printf"는 코드 순서와 다르게 출력될 수 있다. 

<!-- 우리가 의도한 결과 -->
C++'s cout 1
C's printf
C++'s cout 2

<!--동기화를 하지 않았을 때 나올 수 있는 결과1-->
C's printf
C++'s cout 1
C++'s cout 2

<!--동기화를 하지 않았을 때 나올 수 있는 결과2-->
C++'s cout 1
C's printf
C++'s cout 2

<!--동기화를 하지 않았을 때 나올 수 있는 결과3-->
C++'s cout 1
C++'s cout 2
C's printf

 

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함