¿Qué puede hacer C ++ que sea demasiado difícil o complicado en cualquier otro idioma? [c++]


Answers

RAII / finalización determinista . No, la recolección de basura no es tan buena cuando se trata de un recurso compartido y escaso.

Acceso sin restricciones a las API de OS .

Question

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!




La destrucción de objetos determinista conduce a algunos patrones de diseño magníficos. Por ejemplo, aunque RAII no es una técnica tan general como la recolección de basura, lleva a algunas capacidades impresionantes que no se pueden obtener con GC.

C ++ también es único en que tiene un preprocesador de Turing completo. Esto le permite preferir (al contrario que diferir) muchas tareas de código para compilar tiempo en lugar de tiempo de ejecución. Por ejemplo, en el código real puede tener una declaración assert () para probar un nunca-suceda. La realidad es que tarde o temprano sucederá ... y ocurrirá a las 3:00 a.m. cuando estés de vacaciones. La afirmación del preprocesador de C ++ hace la misma prueba en tiempo de compilación. Las afirmaciones en tiempo de compilación fallan entre las 8:00 a.m. y las 5:00 p.m. mientras está sentado frente a la computadora observando la compilación del código; el tiempo de ejecución afirma que fallan a las 3:00 a.m. cuando estás dormido en Hawai'i. Es bastante fácil ver la victoria allí.

En la mayoría de los lenguajes, los patrones de estrategia se realizan en tiempo de ejecución y arrojan excepciones en caso de que no coincidan los tipos. En C ++, las estrategias se pueden realizar en tiempo de compilación a través de la instalación del preprocesador y se puede garantizar la seguridad de tipo.




Creo que voy a elogiar a C ++ por su capacidad de usar plantillas para capturar expresiones y ejecutarlas perezosamente cuando sea necesario. Para aquellos que no saben de qué se trata, aquí hay un ejemplo.




Control absoluto sobre el diseño de la memoria, la alineación y el acceso cuando lo necesite. Si eres lo suficientemente cuidadoso, puedes escribir algunos programas muy caché. Para programas multiprocesador, también puede eliminar una gran cantidad de ralentizaciones de los mecanismos de coherencia de caché.

(Bien, puedes hacer esto en C, ensamblar, y probablemente Fortran también. Pero C ++ te permite escribir el resto de tu programa en un nivel superior).




Técnicamente, creo que no hay ninguno, realmente!

Honestamente, no creo que haya algo que C ++ pueda hacer y The D Language no puede. No importa qué habilidad tenga C ++, siempre es más difícil y desordenado que D o cualquier otro idioma. Incluso una cosa simple como una declaración de clase es mucho más difícil y desordenada en C ++ que en cualquier otro idioma.

Lo único que C ++ puede hacer es ser compatible con millones de líneas de códigos ya escritas en C ++.
Esto es lo único que ningún otro idioma que no sea C ++ puede hacer :)




C # y Java te obligan a poner tu 'función main ()' en una clase. Me parece extraño, porque diluye el significado de una clase.

Para mí, una clase es una categoría de objetos en tu dominio problemático. Un programa no es tal objeto. Entonces nunca debe haber una clase llamada 'Programa' en su programa. Esto sería equivalente a una prueba matemática que utiliza un símbolo para anotarse a sí mismo, la prueba, junto con símbolos que representan objetos matemáticos. Será simplemente extraño e inconsistente.

Afortunadamente, a diferencia de C # y Java, C ++ permite funciones globales. Eso permite que su función main () exista fuera. Por lo tanto C ++ ofrece una implementación más simple, más consistente y quizás más verdadera de la expresión idiomática orientada a objetos. Por lo tanto, esto es algo que C ++ puede hacer, pero C # y Java no pueden.




Control estricto de los recursos del sistema (especialmente la memoria) a la vez que ofrece potentes mecanismos de abstracción de manera opcional. El único lenguaje que conozco que puede acercarse a C ++ en este sentido es Ada.




Bueno, para ser honesto, puedes hacer casi cualquier cosa si estás dispuesto a escribir suficiente código.

Entonces, para responder a su pregunta, no, no hay nada que no pueda hacer en otro idioma que C ++ no puede hacer. ¿Es cuánta paciencia tienes y estás dispuesto a dedicar las largas noches de insomnio para que funcione?

Hay cosas que las envolturas de C ++ hacen que sea fácil de hacer (porque pueden leer los archivos de encabezado), como el desarrollo de Office. Pero, de nuevo, es porque alguien escribió un montón de código para "envolverlo" para usted en un RCW o "Contenedor invocable en tiempo de ejecución"

EDITAR: También te das cuenta de que esta es una pregunta cargada.