C ++에서 std :: cout과 fprintf의 근본적인 차이점은 무엇입니까? 하나는 다른 것보다 좋거나 빠릅니까?


대답 1:

std :: cout을 사용하면 오버로드 된 연산자 <<가 인수에서 호출되고 fprintf를 사용하면 인수가 문자열로 캐스트됩니다. 두 가지 기본 논리는 동일하게 유지됩니다.

cstdio는 동기화가 활성화 된 경우 빠르지 만 iostream은 빨라지며, 경우에 따라 동기화를 비활성화하면 훨씬 빠릅니다. 좋은 C ++ 코드에서는 iostream 만 사용해야하므로 std :: ios :: sync_with_stdio (false)를 호출하여 동기화를 비활성화 할 수 있습니다.

노트

일반적인 생각과는 달리 C ++ 라이브러리와 C 라이브러리 모두에 동일한 기능이 존재하는 경우 컴파일러 최적화로 인해 C ++ 구현이 거의 항상 향상됩니다.


대답 2:

예, std :: cout이 더 좋습니다. std :: ostream이므로 std :: stringstream도 sprintf라는 printf 변형과 유사합니다.

printf에는 몇 가지 문제가 있습니다.

  1. 형식 문자열을 사용하여 나머지 인수를 인쇄하는 방법뿐만 아니라 유형 시스템과 관련이없는 유형을 지정하기 위해 컴파일러에서 사용자가 원하는 유형을 알지 못합니다. 인쇄. 이 문제를 해결하기 위해 최신 C 및 C ++ 컴파일러는 컴파일시이 문자열을 해석하려고 시도합니다. 이는이 함수에 대한 특별한 처리입니다. 어떤 기능도 특별하게 취급 할 필요가 없습니다. varargs를 사용하여 유형을 지우므로 문제 # 1은 피해야 할 때 매우 중요합니다.

std :: cout과 같은 std :: ostream에는 인쇄하려는 각 유형에 대해 << 연산자가 정의되어 있으며 대부분이 유형을 수행하기 위해 기본 유형의 << 연산자를 호출 할 수 있습니다. 각 << 연산자 함수는 인쇄하는 유형을 알고 있으며 컴파일 타임에 전체적으로 안전합니다. 따라서 형식 문자열을 기반으로 printf에 충분한 인수를 전달하지 않는 런타임 문제는 더 이상 문제가되지 않습니다. std :: ostream은 ' 형식 문자열이 필요하지 않습니다.

속도 차이는 완전히 암시 적으로 결정되지만 std :: cout은 인라인을 통해 printf보다 속도가 빠릅니다.


대답 3:

예, std :: cout이 더 좋습니다. std :: ostream이므로 std :: stringstream도 sprintf라는 printf 변형과 유사합니다.

printf에는 몇 가지 문제가 있습니다.

  1. 형식 문자열을 사용하여 나머지 인수를 인쇄하는 방법뿐만 아니라 유형 시스템과 관련이없는 유형을 지정하기 위해 컴파일러에서 사용자가 원하는 유형을 알지 못합니다. 인쇄. 이 문제를 해결하기 위해 최신 C 및 C ++ 컴파일러는 컴파일시이 문자열을 해석하려고 시도합니다. 이는이 함수에 대한 특별한 처리입니다. 어떤 기능도 특별하게 취급 할 필요가 없습니다. varargs를 사용하여 유형을 지우므로 문제 # 1은 피해야 할 때 매우 중요합니다.

std :: cout과 같은 std :: ostream에는 인쇄하려는 각 유형에 대해 << 연산자가 정의되어 있으며 대부분이 유형을 수행하기 위해 기본 유형의 << 연산자를 호출 할 수 있습니다. 각 << 연산자 함수는 인쇄하는 유형을 알고 있으며 컴파일 타임에 전체적으로 안전합니다. 따라서 형식 문자열을 기반으로 printf에 충분한 인수를 전달하지 않는 런타임 문제는 더 이상 문제가되지 않습니다. std :: ostream은 ' 형식 문자열이 필요하지 않습니다.

속도 차이는 완전히 암시 적으로 결정되지만 std :: cout은 인라인을 통해 printf보다 속도가 빠릅니다.


대답 4:

예, std :: cout이 더 좋습니다. std :: ostream이므로 std :: stringstream도 sprintf라는 printf 변형과 유사합니다.

printf에는 몇 가지 문제가 있습니다.

  1. 형식 문자열을 사용하여 나머지 인수를 인쇄하는 방법뿐만 아니라 유형 시스템과 관련이없는 유형을 지정하기 위해 컴파일러에서 사용자가 원하는 유형을 알지 못합니다. 인쇄. 이 문제를 해결하기 위해 최신 C 및 C ++ 컴파일러는 컴파일시이 문자열을 해석하려고 시도합니다. 이는이 함수에 대한 특별한 처리입니다. 어떤 기능도 특별하게 취급 할 필요가 없습니다. varargs를 사용하여 유형을 지우므로 문제 # 1은 피해야 할 때 매우 중요합니다.

std :: cout과 같은 std :: ostream에는 인쇄하려는 각 유형에 대해 << 연산자가 정의되어 있으며 대부분이 유형을 수행하기 위해 기본 유형의 << 연산자를 호출 할 수 있습니다. 각 << 연산자 함수는 인쇄하는 유형을 알고 있으며 컴파일 타임에 전체적으로 안전합니다. 따라서 형식 문자열을 기반으로 printf에 충분한 인수를 전달하지 않는 런타임 문제는 더 이상 문제가되지 않습니다. std :: ostream은 ' 형식 문자열이 필요하지 않습니다.

속도 차이는 완전히 암시 적으로 결정되지만 std :: cout은 인라인을 통해 printf보다 속도가 빠릅니다.


대답 5:

예, std :: cout이 더 좋습니다. std :: ostream이므로 std :: stringstream도 sprintf라는 printf 변형과 유사합니다.

printf에는 몇 가지 문제가 있습니다.

  1. 형식 문자열을 사용하여 나머지 인수를 인쇄하는 방법뿐만 아니라 유형 시스템과 관련이없는 유형을 지정하기 위해 컴파일러에서 사용자가 원하는 유형을 알지 못합니다. 인쇄. 이 문제를 해결하기 위해 최신 C 및 C ++ 컴파일러는 컴파일시이 문자열을 해석하려고 시도합니다. 이는이 함수에 대한 특별한 처리입니다. 어떤 기능도 특별하게 취급 할 필요가 없습니다. varargs를 사용하여 유형을 지우므로 문제 # 1은 피해야 할 때 매우 중요합니다.

std :: cout과 같은 std :: ostream에는 인쇄하려는 각 유형에 대해 << 연산자가 정의되어 있으며 대부분이 유형을 수행하기 위해 기본 유형의 << 연산자를 호출 할 수 있습니다. 각 << 연산자 함수는 인쇄하는 유형을 알고 있으며 컴파일 타임에 전체적으로 안전합니다. 따라서 형식 문자열을 기반으로 printf에 충분한 인수를 전달하지 않는 런타임 문제는 더 이상 문제가되지 않습니다. std :: ostream은 ' 형식 문자열이 필요하지 않습니다.

속도 차이는 완전히 암시 적으로 결정되지만 std :: cout은 인라인을 통해 printf보다 속도가 빠릅니다.