Aunque es una vieja pregunta, me gustaría agregar mis 5cents aquí, ya que probablemente no sea el único que encuentre esta pregunta a través de un motor de búsqueda.
que no puedo comentar sobre la velocidad de compilación, sino en la velocidad de ejecución:
A lo mejor de mi conocimiento, no es sólo una característica de C++ que cuesta el rendimiento, incluso si no lo utiliza. Esta característica son las excepciones de C++, porque evitan algunas optimizaciones del compilador (esta es la razón por la cual se introdujo noexcept
en C++ 11). Sin embargo, si utiliza algún tipo de mecanismo de comprobación de errores, entonces las excepciones son probablemente más eficientes que la combinación de verificación de valor de retorno y muchas declaraciones if else
. Esto es especialmente cierto, si tiene que escalar un error en la pila.
De todos modos, si desactivas las excepciones durante la compilación, C++ no introduce sobrecarga, excepto en los lugares donde utilizas deliberadamente las funciones asociadas (por ejemplo, no tienes que pagar por el polimorfismo si no usas funciones virtuales), mientras que la mayoría de las características no introducen ningún tipo de sobrecarga de tiempo de ejecución (sobrecarga, plantillas, espacios de nombres, etc.). Por otro lado, la mayoría de las formas de código genérico serán mucho más rápidas en C++ que el equivalente en c, porque C++ proporciona los mecanismos incorporados (plantillas y clases) para hacer esto. Un ejemplo típico es cs qsort vs C++ 's std :: sort. La versión de C++ suele ser mucho más rápida, porque dentro de la clasificación, la función de comparador utilizado se conoce en tiempo de compilación, que al menos guarda una llamada a través de una función de búsqueda y en el mejor de los casos permite una gran cantidad de optimizaciones de compilación adicionales.
Habiendo dicho eso, el "problema" con C++ es que es fácil ocultar la complejidad del usuario de modo que un código aparentemente inocente podría ser mucho más lento de lo esperado. Esto se debe principalmente a la sobrecarga del operador, el polimorfismo y los constructores/destructores, pero incluso una simple llamada a una función miembro oculta el this
-pointer pasado que tampoco es un NOP. Considerando la sobrecarga del operador: cuando ve un *
en c, sabe que esto es (en la mayoría de las arquitecturas) una instrucción de ensamblador única y barata, en C++ por otro lado puede ser una función compleja (piense en la multiplicación de matrices). Eso no significa que pueda implementar la misma funcionalidad en c más rápido, pero en C++ no ve directamente que esto podría ser una operación costosa. Destructors son un caso similar: en C++ "moderno", apenas verá destrucciones explícitas a través de supresión pero cualquier variable local que salga del alcance podría desencadenar una costosa llamada a un destructor (virtual) sin una sola línea de código que indica esto (ignorando }
por supuesto). Y, por último, algunas personas (especialmente las procedentes de Java) tienden a escribir jerarquías de clases complejas con muchas funciones virtuales, donde cada llamada a dicha función es una llamada de función indirecta oculta que es difícil o imposible de optimizar. Por lo tanto, aunque esconder la complejidad del programador es, en general, algo bueno que a veces tiene un efecto adverso en el tiempo de ejecución, si el programador no conoce los costos de estas construcciones "fáciles de usar".
Como resumen, diría que C++ hace que sea más fácil para los programadores sin experiencia escribir código lento (porque no ven ineficiencias directamente en un programa). Pero C++ también permite a los buenos programadores escribir códigos "buenos", correctos y rápidos más rápido que con c, lo que les da más tiempo para pensar acerca de las optimizaciones cuando realmente son necesarias.
P.S .:
Dos cosas que no he mencionado (probablemente entre otros que simplemente olvidó) son C++ capacidad de 's para cálculos complejos en tiempo de compilación (gracias a las plantillas y constexpr) y de c restringen la palabra clave. Esto se debe a que aún no los utilicé en programas de tiempo crítico, por lo que no puedo comentar sobre su utilidad general y el beneficio del rendimiento en el mundo real.
Creo que un poco de búsqueda en Google dará diez mil visitas sobre este tema, incluidos numerosos ensayos y trabajos de investigación. – Lundin
@Lundin: admiro que SO tenga un grupo excelente de expertos que ofrezcan valiosos consejos y recomendaciones basados en sus experiencias personales y profesionales. No se usaría SO si uno tuviera que buscar en Google y leer decenas y miles de ensayos en lugar de beneficiarse de las experiencias de otros programadores expertos. –
El problema con esta pregunta es "el mismo programa en C". El problema es que ingenuamente implementar el mismo programa en C no le da el mismo programa. El compilador de C++ genera mucho más código que no ve realmente que el programador "C" debería implementar para que los programas sean iguales. Por lo tanto, debe agregar una tercera medida subjetiva a su prueba. ¿Cuánto tiempo lleva 'escribir' un programa equivalente de C++/C? Dada una aplicación no trivial, sospecho que la diferencia es significativa. –