c++ español - ¿Qué puede hacer C ++ que sea demasiado difícil o complicado en cualquier otro idioma?




8 Answers

Me he quedado con C ++, ya que sigue siendo el lenguaje de propósito general de más alto rendimiento para aplicaciones que necesitan combinar eficiencia y complejidad. Como ejemplo, escribo software de modelado de superficie en tiempo real para dispositivos de mano para la industria topográfica. Dados los recursos limitados, Java, C #, etc. simplemente no proporcionan las características de rendimiento necesarias, mientras que los lenguajes de nivel inferior como C son mucho más lentos de desarrollar dado las características de abstracción más débiles. El rango de niveles de abstracción disponible para un desarrollador de C ++ es enorme, en un extremo puedo sobrecargar operadores aritméticos de modo que puedo decir algo como MaterialVolume = DesignSurface - GroundSurface mientras que al mismo tiempo ejecuto varios montones diferentes para administrar la memoria más eficientemente para mi aplicación en un dispositivo específico. Combine esto con una gran cantidad de fuentes de libre acceso para resolver casi cualquier problema común, y tiene un diablo con un poderoso lenguaje de desarrollo.

¿Sigue siendo C ++ la solución de desarrollo óptima para la mayoría de los problemas en la mayoría de los dominios? Probablemente no, aunque en un apuro todavía se puede utilizar para la mayoría de ellos. ¿Sigue siendo la mejor solución para el desarrollo eficiente de aplicaciones de alto rendimiento? En mi humilde opinión, sin lugar a dudas.

shopkins traduccion

Todavía siento que C ++ ofrece algunas cosas que no pueden ser superadas. No es mi intención iniciar una guerra de llamas aquí, por favor, si tienes buenas opiniones acerca de que no me gusta C ++, no las descargues aquí. Estoy interesado en escuchar a los gurús de C ++ sobre por qué se quedan con él.

Estoy particularmente interesado en aspectos de C ++ que son poco conocidos o subutilizados.

Editar: personas, por favor tengan al menos una lectura superficial de otras respuestas para asegurarse de que no están duplicando lo que ya se ha dicho, si están de acuerdo con lo que alguien más ha dicho, ¡vuélvanlo!




Disparándose en el pie.

Ningún otro idioma ofrece una variedad tan creativa de herramientas. Punteros, herencia múltiple, plantillas, sobrecarga del operador y un preprocesador.

Un lenguaje maravillosamente poderoso que también ofrece abundantes oportunidades para disparar a pie.

Editar: Pido disculpas si mi poco sentido del humor ha ofendido a algunos. Considero que C ++ es el lenguaje más poderoso que he usado alguna vez, con habilidades para codificar en el nivel de lenguaje ensamblador cuando lo desee y con un alto nivel de abstracción cuando lo desee. C ++ ha sido mi idioma principal desde principios de los 90.

Mi respuesta se basó en años de experiencia de dispararme en el pie. Al menos C ++ me permite hacerlo elegantemente.




Escribir el ensamblaje en línea (MMX, SSE, etc.).

Destrucción determinística de objetos. Es decir, destructores reales. Facilita la administración de recursos escasos. Permite RAII.

Acceso más fácil a datos binarios estructurados. Es más fácil convertir una región de memoria en una estructura que analizarla y copiar cada valor en una estructura.

Herencia múltiple No todo se puede hacer con interfaces. A veces también quieres heredar la funcionalidad real.




Los mixins de plantilla proporcionan reutilización que no he visto en otro lugar. Con ellos puedes construir un objeto grande con mucho comportamiento como si hubieras escrito todo a mano. Pero todos estos pequeños aspectos de su funcionalidad se pueden reutilizar, es particularmente bueno para implementar partes de una interfaz (o todo), donde está implementando una serie de interfaces. El objeto resultante es increíblemente rápido porque está todo en línea.

La velocidad puede no ser importante en muchos casos, pero cuando se escribe software de componentes y los usuarios pueden combinar componentes de forma complicada e inimaginable, la velocidad de la creación de líneas y C ++ parece permitir la creación de estructuras mucho más complejas.




Probablemente esta no sea una respuesta popular, pero creo que lo que diferencia a C ++ son sus capacidades de tiempo de compilación, por ejemplo, plantillas y #define. Puede hacer todo tipo de manipulación de texto en su programa usando estas características, muchas de las cuales han sido abandonadas en idiomas posteriores en nombre de la simplicidad. Para mí, eso es mucho más importante que cualquier manipulación de bits de bajo nivel supuestamente más fácil o más rápida en C ++.

C #, por ejemplo, no tiene una función macro real. No puede #incluir otro archivo directamente en la fuente, ni usar #define para manipular el programa como texto. Piensa en cualquier momento en que hayas escrito mecánicamente el código repetitivo y sabías que había una mejor manera. Incluso puede haber escrito un programa para generar código para usted. Bueno, el preprocesador C ++ automatiza todas estas cosas.

La instalación de "genéricos" en C # es similarmente limitada en comparación con las plantillas de C ++. C ++ le permite aplicar el operador punto a una plantilla tipo T a ciegas, llamando (por ejemplo) a métodos que pueden no existir, y las comprobaciones de corrección solo se aplican una vez que la plantilla se aplica realmente a una clase específica. Cuando eso suceda, si todas las suposiciones que hizo sobre T en realidad son válidas, entonces su código se compilará. C # no permite esto ... el tipo "T" básicamente tiene que tratarse como un Objeto, es decir, usa solo el mínimo común denominador de operaciones disponible para todo (asignación, GetHashCode (), Equals ()).

C # ha eliminado el preprocesador y los genéricos reales, en nombre de la simplicidad. Lamentablemente, cuando uso C #, me encuentro buscando sustitutos para estos constructos de C ++, que inevitablemente están más hinchados y en capas que el enfoque de C ++. Por ejemplo, he visto a los programadores trabajar en torno a la ausencia de #include en varias formas infladas: vincular dinámicamente a ensamblajes externos, redefinir constantes en varias ubicaciones (un archivo por proyecto) o seleccionar constantes de una base de datos, etc.

Como dijo una vez la Sra. Crabapple de The Simpson's, esto es "bastante cojo, Milhouse".

En términos de informática, estas características de tiempo de compilación de C ++ permiten cosas como el paso de parámetros call-by-name, que se sabe que es más poderoso que call-by-value y call-by-reference.

De nuevo, esta quizás no sea la respuesta popular; cualquier texto introductorio de C ++ te advertirá sobre #define, por ejemplo. Pero después de haber trabajado con una gran variedad de idiomas durante muchos años y de haber considerado la teoría detrás de todo esto, creo que mucha gente está dando malos consejos. Este parece ser especialmente el caso en el subcampo diluido conocido como "IT".




Pasar estructuras POD a través de procesos con una sobrecarga mínima. En otras palabras, nos permite manejar fácilmente blobs de datos binarios.




Creo que la sobrecarga del operador es una característica bastante agradable. Por supuesto, puede ser muy abusado (como en Boost lambda).




C ++ proporciona un control completo sobre la memoria y, como resultado, hace que el flujo de ejecución del programa sea mucho más predecible. No solo puede decir con precisión en qué momento se producen las asignaciones y desasignaciones de la memoria, puede definir sus propios montones, tener varios montones para diferentes propósitos y decir con precisión dónde se asignan los datos de la memoria. Esto es frecuentemente útil cuando se programan sistemas embebidos / en tiempo real, como consolas de videojuegos, teléfonos celulares, reproductores mp3, etc., que:

  1. tener límites superiores estrictos en la memoria que es fácil de alcanzar (con una PC que se vuelve más lenta a medida que se agota la memoria física)
  2. frecuentemente tienen un diseño de memoria no homogéneo. Es posible que desee asignar objetos de un tipo en una pieza de memoria física y objetos de otro tipo en otra pieza.
  3. tener restricciones de programación en tiempo real. Llamar inesperadamente al recolector de basura en el momento incorrecto puede ser desastroso.

AFAIK, C y C ++ son la única opción sensata para hacer este tipo de cosas.




Related

c++ unique

Tags

c++   unique