traductor traducir traduccion shopkins ingles google español c++ unique

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



status traductor google (16)

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!


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.


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).


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.


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


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.


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.


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.


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.


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.


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 :)


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 .


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.


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".


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.


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.