• Compra una licencia de Windows 10/11 (10€) u Office (18€) al mejor precio u Office al mejor precio. Entra en este post con las ofertas
  • Conoce los Días Naranjas de PcComponentes: descuentos de hasta un 40% en tecnología. Entra en este post con las ofertas
  • ¡Bienvenid@! Recuerda que para comentar en el foro de El Chapuzas Informático necesitas registrar tu cuenta, tardarás menos de 2 minutos y te dará valiosa información además de ayudarte en lo que necesites o pasar un rato agradable con nosotros.

Ventajas, rendimiento y seguridad C++ vs C

Juan_Dev

Nuevo
Registrado
28 Feb 2016
Mensajes
21
Puntos
0
Edad
26
Alguien con conocimientos que me pueda ayudar. Gracias
 
Juan_Dev

La verdad es que es un tema más complicado de lo que parece. De todos modos te dejo algunos datos basados en mi experiencia con ambos lenguajes:

Ventajas en rendimiento de C++:

Debido a la constante evolución y optimización que hubo en C++, sus instrucciones al ser ejecutadas son un poco más rápidas siempre y cuando no se importe ninguna librería relacionada con C. Fíjate en las fechas de las últimas revisiones del lenguaje y te darás cuenta que son bastante recientes.

Los constructores, destructores, métodos virtuales y las plantillas hacen que el código de C++ sea mucho más fácil y rápido de realizar que el código equivalente en C, aunque requiera un dominio considerable del lenguaje.

Los tipos String son indudablemente mucho más flexibles y adaptables que los de C.

Ventajas en seguridad de C++:

En mi opinión C es más inseguro que C++ al no haber comprobación de límites de matrices, que en algunos casos, se pueden volver fácilmente explotables a través de la función scanf en la conversión de tipos %.

La gestión de memoria en C es mucho más laboriosa y más propensa a errores. Por ejemplo, si creas un contenedor propio, eres responsable de intentar hacer coincidir todas las asignaciones y no conformarse a que sean parciales en caso de error.

Mientras que C++, tiene más contenedores que generan excepciones si se intenta acceder fuera del rango definido, por lo que estos proporcionan una mayor seguridad.

De todos modos ya te digo que según el proyecto que quieras hacer deberás usar uno u otro, más que nada para sacarle mejor partido.
 
Última edición:
Parece complicado. La diferencia de rendimiento de cuánto es?

Gracias.
 
Parece complicado. La diferencia de rendimiento de cuánto es?

Gracias.

No es algo generalizado y depende de cada función en concreto. Por ejemplo, si creas un simple programa en C donde uses la función scanf definida en la directiva stdio.h y la función cin definida en iostream en C++, la primera será más rápida que la segunda a no ser que desactives la sincronización de iostream con stdio.h.

Te dejo los resultados que me dan a mí con el IDE Xcode en OS X:

Con iostream: 0.49 segundos.
Con stdio.h: 0.23 segundos.
Con iostream sin sincronización stdio.h: 0.12 segundos.

En programas con muchas líneas de código la diferencia sí podría ser de un segundo, todo depende del cálculo del programa.

Edito: Actualizo los valores que no tenía bien configurado Xcode.

Edito2: Vuelvo a actualizar con los valores finales. He tenido que escribir un programa más grande que requiera más uso de CPU para que se vean las diferencias.

Edito3: Añado un decimal más.
 
Última edición:
De hecho, al ser C++ una extensión de C, es normal que sea mejor en la mayoría de casos. Eso si, como dice el compañero es mas complejo. Se requieren conocimientos de programación orientada a objetos entre otras cosas para poder sacar todo su potencial.
 
Pero los programas actuales como motores de ajedrez, videojuegos, etc en que estan programados y por que?
 
Juan_Dev

En el caso de StockFish que es un motor de ajedrez de código abierto, está desarrollado en C++11, aunque creo que en un inicio estuvo desarrollado en C, pero más adelante fue portado. El por qué se portó el código de C a C++ se basa en la eficiencia. Verás, en un motor de ajedrez es mucho más rápido realizar el código en C++ que en C, y todo ello sumado a las ventajas que ofrece el propio lenguaje en general (POO, punteros mejorados, manejo de la memoria, etc). El mismo ejemplo se puede aplicar para el desarrollo de videojuegos.

Si estás interesado en aprender alguno de los dos lenguajes, te recomiendo empezar por C. Es un lenguaje mucho más reducido y no te desanimarás tan rápidamente que si empezases primero a aprender C++. Eso sí, yo te recomiendo aprender ambos, ya que hoy en día se usa uno u otro según el ámbito y el proyecto a realizar.
 
Aprovecho este hilo para hacer una pregunta relacionada. En la universidad, estamos aprendiendo a programar con C++, me gustaría saber, a día de hoy en que se suele utilizar c++, siempre leo que se busca gente con altos conocimientos de java, o que tal y cual programa están hechos en java. Y me surge esa duda, para que se utiliza más que nada c++ en 2016, claró está que realmente se puede utilizar para casi todo, pero en que es realmente útil frente a otros lenguajes.

Gracias, un saludo.
 
Hola acataln

Pues lo mismo que he comentado antes, en C++ se suele usar cuando necesitas usar las características que ofrece dicho lenguaje, o bien requieran un apartado gráfico. Tienes el ejemplo en los navegadores y cualquier suite ofimática. Si quisieses desarrollar un controlador para una placa base, sería estúpido usar C++, por lo que se usarías C que tiene sus ventajas en lo que respecta a desarrollos más internos. En el caso de Java se suele usar en desarrollos que requieran obligatoriamente su ejecución en varios sistemas operativos, sin importar la optimización y eficiencia que tenga el proyecto. Pero nunca verás grandes proyectos (siempre hay alguien que hace experimentos) usar este lenguaje, el rendimiento no es bueno y empeora contra más grande sea el proyecto si lo comparamos con un lenguaje compilado que genere un archivo ejecutable según la plataforma.
 
Hola acataln

Pues lo mismo que he comentado antes, en C++ se suele usar cuando necesitas usar las características que ofrece dicho lenguaje, o bien requieran un apartado gráfico. Tienes el ejemplo en los navegadores y cualquier suite ofimática. Si quisieses desarrollar un controlador para una placa base, sería estúpido usar C++, por lo que se usarías C que tiene sus ventajas en lo que respecta a desarrollos más internos. En el caso de Java se suele usar en desarrollos que requieran obligatoriamente su ejecución en varios sistemas operativos, sin importar la optimización y eficiencia que tenga el proyecto. Pero nunca verás grandes proyectos (siempre hay alguien que hace experimentos) usar este lenguaje, el rendimiento no es bueno y empeora contra más grande sea el proyecto si lo comparamos con un lenguaje compilado que genere un archivo ejecutable según la plataforma.

Creo que te has columpiado bastante con ese comentario. Y con el del rendimiento, en parte también. Creo que hablas pensando en tiempos pasados, cuando Java era lento "de narices", pero hoy la situación no es parecida en absoluto. En muchos casos verás que la misma implementación en Java y en C++ es más rápida en Java, sobre todo en cálculos numéricos. Java hoy se usa cada día más para computación científica, de hecho.

Y en general, Java se usa en cualquier cosa que imagines. Salvo sistemas en tiempo real, no me imagino algo en lo que no haya presentes ejemplos de Java. ¿Que no hay software grande escrito en Java? No sé si te has dado una vuelta por las empresas grandes, casi todo su software está escrito en Java. Y no sé si conoces Hadoop o Cassandra, por ejemplo, aplicaciones grandes y relativamente pesadas donde el rendimiento es algo muy importante y que están escritas íntegramente en Java. Y aplicaciones con entorno gráfico hay a patadas: tienes la suite de Lotus, LibreOffice, Eclipse y Netbeans... y mil ejemplos más que se usan en el día a día.

Tampoco es que la capacidad multiplataforma sea exclusiva de Java. Toda la vida se hicieron programas en C++ que se compilaban para varios sistemas. Tampoco es que Java sea siempre más rápido, pero sabiendo esto, ¿por qué alguien usaría C/C++?

Pues porque te permiten un manejo a bajo nivel de la máquina que no te permite Java, lo que te da lugar a llevar más lejos la optimización. Pero tampoco nos equivoquemos, un software no es más rápido sólo porque se escribió en un determinado lenguaje, sino que lo es porque quien lo programó hizo un uso eficiente de las características del lenguaje e implementó algoritmos y estructuras de datos eficientes. Una implementación ineficiente lo es en Java, en C y en el lenguaje que sea.

Al final los lenguajes son herramientas, y como tales, el resultado final depende más de quién utilice las herramientas y cómo lo haga que de la herramienta en si, aunque evidentemente muchos lenguajes tienen características que los hacen más apropiados para unos tipos de desarrollo que otros.
 
Hola oMega_2093

No estoy hablando del Java antiguo, estoy hablando del actual. Que el actual sea mucho más rápido que el antiguo no significa que sea rápido, de hecho no lo es, otra cosa es que no se aprecie según el equipo y proyecto que estemos usando. Puedes programar tu mismo alguna aplicación gráfica que no sea simple, con diverso contenido, que haga uso del procesador y medir los tiempos, no entiendo cómo me discutes esto.

Sé que hay software escrito en Java, sería estúpido pensar que el lenguaje más usado actualmente no tuviese ningún proyecto, pero yo me refiero a proyectos de calidad, y es que para mí, realizar un programa el cual se escriba en Java por la ventaja de ser multiplataforma sin importar el rendimiento es de ser un desarrollador del montón, un buen desarrollador debe conocer un lenguaje que saque el mayor partido a cada plataforma, y todos sabemos que Java es el lenguaje más usado actualmente por el hecho de ser multiplataforma, de otra manera no tendría sentido ni como lenguaje en sí.

No me vale que me pongas ejemplos como NetBeans, que un IDE con todo lo que realmente conlleva esté escrito en Java es lamentable, mira el rendimiento y los problemas que ha acarreado hace muy poquitos años y las quejas que hubo, y volvemos a lo mismo, ventaja multiplataforma. En el caso de LibreOffice es algo que entiendo, si ofreces una suite ofimática completamente gratuita no todo puede ser bonito, pero puedes medir los tiempos de ejecución con la última versión de Office, LibreOffice tiene muchas menos funciones en algunos de sus programas, menos efectos visuales, menos contenido que cargar y es más lento al arrancar y consume un poquitín más de recursos, y eso que Office no está totalmente escrito en C++.

Respecto al tema del soporte de lenguaje de bajo nivel es simplemente una ventaja de C/C++, porque yo no veo que se use Java siempre y cuando no se requiera acceso de bajo nivel a la máquina, más bien por lo mencionado anteriormente, la multiplataforma. Está claro que el desarrollador influye mucho a la hora de optimizar el programa, pero yo estoy hablando a nivel profesional, por lo que al medir la velocidad de un proyecto realizado en ambos lenguajes todos sabemos cual será más rápido.

Por lo tanto y basándose en mi experiencia, si alguien espera que aprendiendo Java puede tener un buen sueldo como desarrollador sin aportar nada nuevo sabiendo la cantidad de gente que sabe este lenguaje, no sabe lo que es ganarse la vida como profesional en esto.
 
Última edición:
No estoy hablando del Java antiguo, estoy hablando del actual. Que el actual sea mucho más rápido que el antiguo no significa que sea rápido, de hecho no lo es, otra cosa es que no se aprecie según el equipo y proyecto que estemos usando. Puedes programar tu mismo alguna aplicación gráfica que no sea simple, con diverso contenido, que haga uso del procesador y medir los tiempos, no entiendo cómo me discutes esto.

Te lo discuto porque el absolutismo con el que proclamas que "Java es lento" no refleja la realidad. Que Java sea más rápido en algunos casos que C++ es un hecho -de verdad, infórmate sobre esto-. La relevancia de ese hecho la podemos debatir, pero es suficiente como para falsear el absolutismo de "Java es lento".

Y precisamente, "haciendo uso del procesador" es cuando Java ofrece un buen rendimiento al nivel C/C++. Es por el overhead de objetos, JVM, entre otros motivos que es más lento en otras operaciones, pero eso no es así en el caso de cálculos. Y muchas partes del código se ejecutan de forma nativa -revisa JIT-.

Eres desarrollador C/C++, ¿no? Siendo así, no entiendo que atribuyas la capacidad multiplataforma a Java como (única) ventaja sobre C/C++ cuando C/C++ son multiplataforma. Y que no menciones la abstracción y la librería estándar de Java como ventaja de éste tampoco puedo entenderlo bien.

Tampoco hablas de Hadoop y Cassandra, escritos en Java y con un rendimiento ejemplar.

Yo simplemente digo que no es tan absoluto como dices: no es blanco o negro. El tema ha cambiado y por tus comentarios creo que sigues en la época pre-2010 sobre Java. No pasa nada, no es ningún delito, sólo digo que el tema ha cambiado desde entonces.
 
oMega_2093

Me refiero a que es más lento que C++. Está claro que Java ha mejorado muchísimo, y es que tenía mucho margen de mejora, pero en proyectos escritos en ambos lenguajes sigo diciendo que la versión escrita en C++ es más rápida. Yo aún no he visto un proyecto grande de verdad donde se hayan usado ambos lenguajes y Java sea más rápido, dando por supuesto la eficiencia del código en ambos casos. Puedes ver la lista de los mayores grandes proyectos usados en la actualidad (aplicaciones) y en los diez primeros puestos ninguno está escrito en Java, debemos suponer que por algo será.

Respecto al tema de la multiplataforma, no quería entrar en detalles técnicos, pero resumiendo ambos sabemos que cuando trabajas en Java prácticamente te olvidas luego de la plataforma en la que sea ejecutada, mientras que en C++ siempre se hacen cambios por librerías según la plataforma entre otras cosas. Estoy de acuerdo que seguramente sea por alguna de sus ventajas, también como anteriormente mencionamos, el no ser tan propenso a errores al descargar el trabajo de bajo nivel reduciendo el número de fallos, pero, ¿sacrificamos rendimiento por esto? ¿No es más útil y mejor que el desarrollador haga el trabajo como es debido?

No dudo que las dos últimas aplicaciones que mencionas sean excelentes en rendimiento, seguramente sean proyectos meticulosamente muy cuidados pero sigo sin saber si son más rápidos que su equivalencia en C++. Al final va a parecer que los próximos videojuegos estarán escritos todos en Java, Dios nos libre, tendríamos que cambiar todos de equipo y aún así no alcanzaríamos el rendimiento que obtenemos actualmente.

Vuelvo a insistir que no me he quedado anclado en 2010, sería contraproducente si una persona que se dedica al desarrollo se quedase estancado en un mundo en el que todos los días hay evolución por algún lado.

Espero que te tomes a bien mis comentarios compañero.

Un saludo.
 
Última edición:
Dos opiniones opuestas, dificil decidirse supongo
 
Juan_Dev

Cada uno comenta sus opiniones bajo sus experiencias, pero ya sabes que la última decisión la tienes tú. Una vez que trabajes a un nivel alto con ambos lenguajes podrás sacar tu propia conclusión.
 
Viendo que habláis sobre java comparando con C y C++ a lo largo de mi experiencia con ambos tengo que decir que java tiene ciertas limitaciones bastante gordas, como por ejemplo, el no poder pasar varias variables de retorno en una función y teniendo que hacer un Array para ello (algo que se usa mucho en videojuegos y otro tipo de desarrollos), o que gracias a los punteros en C++ y C liberas mucho más rápido memoria que con java.

Son cosillas que cuando estas haciendo un proyecto mediano/grande tienes que hacer ñapas para solucionarlo, cosa que en phyton o en C/C++ por ejemplo no tienes que hacerlo
 
Viendo que habláis sobre java comparando con C y C++ a lo largo de mi experiencia con ambos tengo que decir que java tiene ciertas limitaciones bastante gordas, como por ejemplo, el no poder pasar varias variables de retorno en una función y teniendo que hacer un Array para ello (algo que se usa mucho en videojuegos y otro tipo de desarrollos), o que gracias a los punteros en C++ y C liberas mucho más rápido memoria que con java.

Son cosillas que cuando estas haciendo un proyecto mediano/grande tienes que hacer ñapas para solucionarlo, cosa que en phyton o en C/C++ por ejemplo no tienes que hacerlo

En realidad la comparación que mantuvimos era sobre Java y C++ al ser ambos orientado a objetos. Anteriormente sí que comparé C con C++ por el usuario que lo pidió.
 
Espero que te tomes a bien mis comentarios compañero.

No soy de los que se ofenden por la existencia de opiniones contrarias a la propia, ni tampoco por que se defiendan esas opiniones, si se hace desde el respeto, que es como creo que lo hemos estado haciendo. A mi me gusta debatir y hacerlo de forma civilizada, y parte necesaria de eso es la diversidad de puntos de vista. Sucede, y me consta, que mucha gente empieza con descalificaciones o a ofenderse en cuanto se les lleva la contraria una o dos veces. No es mi caso, no te preocupes ;)

Estoy de acuerdo que seguramente sea por alguna de sus ventajas, también como anteriormente mencionamos, el no ser tan propenso a errores al descargar el trabajo de bajo nivel reduciendo el número de fallos, pero, ¿sacrificamos rendimiento por esto? ¿No es más útil y mejor que el desarrollador haga el trabajo como es debido?

Pareces nuevo compañero, y te lo digo desde el respeto. A día de hoy es más barato comprar hierro (ordenadores mejores, servidores más potentes) que hora de trabajo de desarrollador. Por lo tanto, cualquier herramienta que aumente la productividad, aunque sea a costa de verse obligados a meter más hierro, es bienvenida en las empresas.

En general sí hay disposición a sacrificar rendimiento por ello. Una prueba la tienes en la cantidad de software empresarial que está escrito y se está escribiendo en Java y no en C/C++. Si el rendimiento no es un punto clave, normalmente la decisión se inclina hacia Java.

Principalmente, porque es más productivo y la habilidad que se requiere en el programador para hacer un trabajo decente es menor que con C/C++. En otras palabras: hay más gente aceptablemente buena con Java que con C/C++.

Por supuesto, que el programador (y el analista, y el arquitecto, etc) haga bien su trabajo no es tampoco un requisito indispensable. Las empresas buscan, en general y exceptuando las startups milmillonarias de Silicon Valley, a ingenieros "buenos", pero no a "los mejores", que salen mucho más caros. Depende mucho de la cultura organizativa, pero no siempre importa tanto hacer las cosas de "la forma correcta", ni de "la mejor manera posible". Importa hacerlo lo suficientemente bien, sin más, y en general.

Y para decir esto me baso en mi experiencia en empresas. Las calidad importa mientras sea un impedimento para conseguir los objetivos de negocio. Una vez cumplidos éstos, la calidad pasa a un segundo plano.

java tiene ciertas limitaciones bastante gordas, como por ejemplo, el no poder pasar varias variables de retorno en una función y teniendo que hacer un Array para ello

¿Y los otros mil lenguajes que no ofrecen esa posibilidad? No puede ser una limitación "bastante gorda". De hecho, que eso suponga un problema "bastante gordo" en tu desarrollo responde más a cuestiones de falta de diseño o arquitectura deficiente que a una cualidad/"deficiencia" del lenguaje.

¿Necesitas retornar varios tipos primitivos en un método? A lo mejor no estás respetando los principios SOLID del diseño orientado a objetos, o a lo mejor estás intentando realizar programación estructurada en un entorno principalmente orientado a objetos, lo que de nuevo sería una carencia por tu parte y no por el lenguaje.

Que eso se utilice principalmente en videojuegos es un argumento muy general, ya que los videojuegos principalmente se desarrollan con C++ que sí permite eso. Es como cuestionar que mi coche con motor de gasolina no admite combustible diésel cuando los profesionales del transporte (camiones, furgones grandes) utilizan este combustible... A lo mejor es que no estás planteando bien comprarte un coche gasolina si lo que necesitas es un motor diésel.

En este caso, es lo mismo. Quizá no estás planteando bien tu diseño. Yo también me he encontrado con esa limitación en otros lenguajes (PHP, Java, C#). En absolutamente todos los casos el problema no era que no pudiera retornar 2 valores, sino que no estaba respetando los principios del buen diseño de software. En esos casos, retornar 2 valores sí hubiera sido una ñapa para solucionar mis carencias como arquitecto.
 
oMega_2093 dijo:
No soy de los que se ofenden por la existencia de opiniones contrarias a la propia, ni tampoco por que se defiendan esas opiniones, si se hace desde el respeto, que es como creo que lo hemos estado haciendo. A mi me gusta debatir y hacerlo de forma civilizada, y parte necesaria de eso es la diversidad de puntos de vista. Sucede, y me consta, que mucha gente empieza con descalificaciones o a ofenderse en cuanto se les lleva la contraria una o dos veces. No es mi caso, no te preocupes

Me alegra saber esto :p

oMega_2093 dijo:
Pareces nuevo compañero, y te lo digo desde el respeto. A día de hoy es más barato comprar hierro (ordenadores mejores, servidores más potentes) que hora de trabajo de desarrollador. Por lo tanto, cualquier herramienta que aumente la productividad, aunque sea a costa de verse obligados a meter más hierro, es bienvenida en las empresas.

En general sí hay disposición a sacrificar rendimiento por ello. Una prueba la tienes en la cantidad de software empresarial que está escrito y se está escribiendo en Java y no en C/C++. Si el rendimiento no es un punto clave, normalmente la decisión se inclina hacia Java.

Por supuesto, que el programador (y el analista, y el arquitecto, etc) haga bien su trabajo no es tampoco un requisito indispensable. Las empresas buscan, en general y exceptuando las startups milmillonarias de Silicon Valley, a ingenieros "buenos", pero no a "los mejores", que salen mucho más caros. Depende mucho de la cultura organizativa, pero no siempre importa tanto hacer las cosas de "la forma correcta", ni de "la mejor manera posible". Importa hacerlo lo suficientemente bien, sin más, y en general.

Y para decir esto me baso en mi experiencia en empresas. Las calidad importa mientras sea un impedimento para conseguir los objetivos de negocio. Una vez cumplidos éstos, la calidad pasa a un segundo plano.

Entiendo lo que quieres decir, pero no lo comparto del todo. De hecho, al menos en mi caso, en un par de ocasiones me escogieron por encima de otros desarrolladores Java al realizar un programa de facturación específico y otro organizativo, asumiendo en ambos proyectos, que tendrían un coste un poco más elevado al ser escogido. Más adelante y con algo más de confianza, se me hizo saber que en su caso preferían esquivar Java por algunos problemas que tuvieron en el pasado.

Lo que quería decirte en un principio, es que muchos de los programas se notan fluidos por los componentes del equipo, pero probados en otro equipo se notan sus carencias en rendimiento, en mi opinión como desarrollador es que esas cosas son lamentables, hoy en día cualquiera puede hacer un programa algo complejo, pero donde se diferencia al buen desarrollador del resto es en este tipo de cosas. Insisto, los grandes proyectos más usados ninguno está escrito en Java, se premia y se valora a aquellos que son capaces de realizar algo complejo por mucho que requiera más habilidad o coste, de lo contrario los haría cualquiera. En mi caso, siempre me exijo realizar un proyecto con una optimización sobresaliente. Llámame perfeccionista.
 
Entonces las genre que sabe C++ tiene más habilidad ya que es más complejo y requiere mas tiempo para dominarlo?
 
Arriba