En C ++, ¿cuál es la diferencia subyacente entre std:: cout y fprintf? ¿Es uno mejor o más rápido que el otro?


Respuesta 1:

Con std :: cout, se llama al operador sobrecargado << en el argumento, mientras que con fprintf, el argumento se convierte en una cadena. Sin embargo, la lógica básica detrás de ambos sigue siendo la misma.

cstdio es más rápido con la sincronización habilitada pero iostream se vuelve más rápido y, en algunos casos, mucho más rápido si deshabilita la sincronización entre los dos. En un buen código C ++, solo se debe usar iostream y, por lo tanto, puede deshabilitar la sincronización llamando a std :: ios :: sync_with_stdio (falso).

NOTA

Contrariamente a la creencia popular, si existe la misma funcionalidad tanto para las bibliotecas C ++ como para las bibliotecas C, la implementación de C ++ casi siempre será mejor debido a las optimizaciones del compilador.


Respuesta 2:

Sí, std :: cout es mejor. Es un std :: ostream, y también lo es std :: stringstream, que es similar a la variante printf llamada sprintf.

Hay varios problemas con printf.

  1. Utiliza una cadena de formato para especificar no solo cómo imprimir los argumentos restantes, sino también para especificar cuáles son esos tipos, lo que no involucra el sistema de tipos, por lo que el compilador no sabe los tipos de lo que está utilizando. impresión. Para solucionar este problema, los compiladores más nuevos de C y C ++ intentan interpretar esta cadena en tiempo de compilación, lo cual es un tratamiento especial para esta función. Ninguna función debería ser tratada especialmente. Utiliza varargs, que borra el tipo, por lo que el problema # 1 es bastante necesario, cuando no debería serlo.

Un std :: ostream, como std :: cout, tiene el operador << definido para cada tipo que desea imprimir, y la mayoría de ellos puede llamar al operador << de sus tipos primitivos para realizar esta tarea. Cada función de operador << conoce el tipo que imprime y es completamente segura en tiempo de compilación, por lo que el problema de tiempo de ejecución de no pasar suficientes argumentos a printf en función de su cadena de formato ya no es un problema porque std :: ostream no No necesita una cadena de formato.

Las diferencias de velocidad dependen completamente de la implementación, pero std :: cout tiene la posibilidad de ser más rápido que printf a través de la alineación.


Respuesta 3:

Sí, std :: cout es mejor. Es un std :: ostream, y también lo es std :: stringstream, que es similar a la variante printf llamada sprintf.

Hay varios problemas con printf.

  1. Utiliza una cadena de formato para especificar no solo cómo imprimir los argumentos restantes, sino también para especificar cuáles son esos tipos, lo que no involucra el sistema de tipos, por lo que el compilador no sabe los tipos de lo que está utilizando. impresión. Para solucionar este problema, los compiladores más nuevos de C y C ++ intentan interpretar esta cadena en tiempo de compilación, lo cual es un tratamiento especial para esta función. Ninguna función debería ser tratada especialmente. Utiliza varargs, que borra el tipo, por lo que el problema # 1 es bastante necesario, cuando no debería serlo.

Un std :: ostream, como std :: cout, tiene el operador << definido para cada tipo que desea imprimir, y la mayoría de ellos puede llamar al operador << de sus tipos primitivos para realizar esta tarea. Cada función de operador << conoce el tipo que imprime y es completamente segura en tiempo de compilación, por lo que el problema de tiempo de ejecución de no pasar suficientes argumentos a printf en función de su cadena de formato ya no es un problema porque std :: ostream no No necesita una cadena de formato.

Las diferencias de velocidad dependen completamente de la implementación, pero std :: cout tiene la posibilidad de ser más rápido que printf a través de la alineación.


Respuesta 4:

Sí, std :: cout es mejor. Es un std :: ostream, y también lo es std :: stringstream, que es similar a la variante printf llamada sprintf.

Hay varios problemas con printf.

  1. Utiliza una cadena de formato para especificar no solo cómo imprimir los argumentos restantes, sino también para especificar cuáles son esos tipos, lo que no involucra el sistema de tipos, por lo que el compilador no sabe los tipos de lo que está utilizando. impresión. Para solucionar este problema, los compiladores más nuevos de C y C ++ intentan interpretar esta cadena en tiempo de compilación, lo cual es un tratamiento especial para esta función. Ninguna función debería ser tratada especialmente. Utiliza varargs, que borra el tipo, por lo que el problema # 1 es bastante necesario, cuando no debería serlo.

Un std :: ostream, como std :: cout, tiene el operador << definido para cada tipo que desea imprimir, y la mayoría de ellos puede llamar al operador << de sus tipos primitivos para realizar esta tarea. Cada función de operador << conoce el tipo que imprime y es completamente segura en tiempo de compilación, por lo que el problema de tiempo de ejecución de no pasar suficientes argumentos a printf en función de su cadena de formato ya no es un problema porque std :: ostream no No necesita una cadena de formato.

Las diferencias de velocidad dependen completamente de la implementación, pero std :: cout tiene la posibilidad de ser más rápido que printf a través de la alineación.


Respuesta 5:

Sí, std :: cout es mejor. Es un std :: ostream, y también lo es std :: stringstream, que es similar a la variante printf llamada sprintf.

Hay varios problemas con printf.

  1. Utiliza una cadena de formato para especificar no solo cómo imprimir los argumentos restantes, sino también para especificar cuáles son esos tipos, lo que no involucra el sistema de tipos, por lo que el compilador no sabe los tipos de lo que está utilizando. impresión. Para solucionar este problema, los compiladores más nuevos de C y C ++ intentan interpretar esta cadena en tiempo de compilación, lo cual es un tratamiento especial para esta función. Ninguna función debería ser tratada especialmente. Utiliza varargs, que borra el tipo, por lo que el problema # 1 es bastante necesario, cuando no debería serlo.

Un std :: ostream, como std :: cout, tiene el operador << definido para cada tipo que desea imprimir, y la mayoría de ellos puede llamar al operador << de sus tipos primitivos para realizar esta tarea. Cada función de operador << conoce el tipo que imprime y es completamente segura en tiempo de compilación, por lo que el problema de tiempo de ejecución de no pasar suficientes argumentos a printf en función de su cadena de formato ya no es un problema porque std :: ostream no No necesita una cadena de formato.

Las diferencias de velocidad dependen completamente de la implementación, pero std :: cout tiene la posibilidad de ser más rápido que printf a través de la alineación.