¿Todavía se usa el lenguaje de programación C?

96

Soy un programador de C #, y la mayor parte de mi desarrollo es para sitios web junto con algunas aplicaciones de Windows. En lo que respecta a C, no lo he usado en mucho tiempo, ya que no era necesario. Me sorprendió cuando una de mis amigas dijo que necesitaba aprender C para probar trabajos, mientras yo la ayudaba a aprender C #.

Pensé que alguien solo aprendería C para realizar pruebas si se realiza un desarrollo en C. Según mi conocimiento, todo el desarrollo relacionado con COM y el diseño de hardware también se realiza en C ++. Por lo tanto, aprender C no tiene sentido si necesita usar C ++. Tampoco creo en la importancia histórica, entonces ¿por qué perder tiempo y dinero en aprender C?

¿Se sigue utilizando C en algún tipo de desarrollo de software nuevo o en cualquier otra cosa?

Monomeeth
fuente
46
¿Alguna vez has visto un compilador de C ++ para PIC?
SK-logic
195
¿Soy el único que está triste de que alguien equipare el aprendizaje con la pérdida de tiempo y dinero?
Jetti
37
" En mi conocimiento, todo el desarrollo relacionado con COM y diseño de hardware también se realiza en C ++ ". Me parece que en realidad no se hace ningún diseño de interfaz de hardware.
Ed S.
32
La gente olvida que los sofisticados lenguajes de nivel superior que todos amamos a menudo se implementan en C.
David Cowden
13
@ThomasEding ¿Lenguaje muerto? Ciertamente tiene un conocimiento muy limitado de lenguajes de programación si considera que C es un lenguaje muerto.
JesperE

Respuestas:

214

C tiene la ventaja de que es un lenguaje relativamente pequeño , lo que facilita la implementación de un compilador de C (mientras que un compilador de C ++ es un monstruo para escribir) y facilita el aprendizaje del lenguaje . También vea el índice TIOBE , según el cual C está ligeramente por delante de C ++.

En (IMO) orden decreciente de justificación, C todavía se usa mucho para

  • Cosas incrustadas
    Es mucho más fácil portar un compilador de C a una plataforma pequeña que portar un compilador de C ++. Además, los defensores de C afirman que C ++ "hace demasiado a sus espaldas". Sin embargo, en mi opinión eso es FUD.

  • Programación de sistemas
    Una vez más, esto generalmente se debe a las afirmaciones de que es más fácil "saber qué está haciendo el compilador". Sin embargo, muchos programas integrados se beneficiarían, por ejemplo, de plantillas y otras características clave de C ++.


  • Sin embargo, el software de código abierto es principalmente un problema de actitud: OSS siempre ha preferido C sobre C ++ (mientras que es lo opuesto en grandes partes de la industria). El odio irracional de Torvalds podría ser la razón más importante para esto en Linux .

sbi
fuente
16
Es más historia que actitud. Muchos de los que podría considerar los paquetes de código abierto "básicos" se desarrollaron originalmente cuando C ++ no estaba tan ampliamente disponible como ahora y los recursos aún eran escasos.
Blrfl
65
El índice TIOBE es una broma. Los resultados de los buscadores no tienen sentido.
DeadMG
29
@Sedate: Que las plantillas generalmente causan la hinchazón de código es un mito, que proviene de los tiempos de los antiguos compiladores de C ++. Los compiladores modernos plegarán instancias de plantilla idénticas. OTOH, las plantillas permiten la metaprogramación de plantillas, que ejecuta código en tiempo de compilación, en lugar de tiempo de ejecución, lo que genera menos código generado. Además, crean programas mucho más seguros (menos conversión), algo que a menudo es muy importante en el dominio incrustado. EC ++ ha sido golpeado hasta la muerte por expertos en C ++ sobre (entre otras cosas) la pura estupidez de tirar plantillas.
sbi
18
@ James: ¿Te refieres a cosas como abstracciones eficientes, programación genérica y seguridad de tipos? Sí, quién querría eso.
Xeo
11
@JesperE Como sucede, he cambiado de trabajo desde que escribí eso, y ahora estoy programando para dispositivos integrados. Estamos usando C ++, y es notable lo que la metaprogramación de plantillas y STL puede hacer por usted cuando tiene hardware débil y restricciones de tiempo real difíciles, así como necesidades de confiabilidad. (Estamos haciendo plantas de energía.) Sí, debe saber si debe usar a std::vectoro a std::mappara un determinado fragmento de código, pero no tiene que implementarlo usted mismo, sino que puede confiar en un alto rendimiento bien probado, e implementaciones de bibliotecas confiables que ofrecen altas abstracciones.
sbi
119

C se usa mucho en la programación de hardware embebido donde los recursos son escasos.

El kernel de Linux está escrito en C porque, según Linus Torvalds, C ++ es un lenguaje horrible .

Joonas Pulakka
fuente
14
Creo que gran parte del núcleo de Windows también es C. Y muchos sistemas heredados.
Codificador
14
Para estar completo, Linus probó C ++ en el núcleo. Eso fue más un problema que una ventaja. De todos modos, el desarrollo del kernel es un tema realmente específico, eso no significa que C ++ sea malo en general.
deadalnix
75
Según otros , la argumentación de Linus es horrible.
sbi
36
Los argumentos de Linus pueden o no ser válidos, pero el kernel de Linux todavía está escrito en C :-)
Joonas Pulakka
15
Linus es un imbécil.
ubiyubix
94

Todos los lenguajes modernos que he visto pueden interactuar con C:

  • C ++
  • Java
  • C#
  • Pitón
  • Haskell
  • C objetivo

La necesidad de interactuar con C deriva de:

  • C que tiene un ABI simple
  • C estar presente por mucho tiempo

Significa que, dado que esos lenguajes pueden comunicarse con C, pueden:

  • aprovechar sus bibliotecas
  • comunicarse entre sí a través de C (por ejemplo, Clang está escrito en C ++ pero ofrece enlaces de Python conectados a su interfaz C).

Y apostaría a que todos ellos confían en C para sus tiempos de ejecución (a menos que fueran dudosos).

C es el Lingua Franca de los lenguajes de programación y uno de los más simples (ABI-wise) no vinculado a una arquitectura específica (como lo es el ensamblado), tomará un cambio importante deshacerse de él.

Matthieu M.
fuente
45

En mi opinión, esta es una pregunta miope similar a "Mis amigos y yo escuchamos Reggae. ¿Alguien realmente todavía escucha Rap?".

Cada idioma por ahí tiene su uso. Diferentes idiomas definitivamente tienen sus nichos. Pero preguntando por C! Estoy seguro de que menos personas usan C # que C a diario (desde el punto de vista totalmente sesgado de trabajar en una tienda donde nadie usa C #).

Búsqueda rápida en Google sobre la popularidad relativa de los idiomas.
Estoy seguro de que nada de esto tiene autoridad, pero podemos usarlo para ver tendencias:

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
http://langpop.com/

Incluso mirando la proporción SO de preguntas en las etiquetas:
https://stackoverflow.com/tags

  • C #: 209845
  • 16 otras etiquetas
  • C: 38790

Entonces, C es el tema 18 más popular en SO (y hay muchos otros lenguajes allí).

Nota: El índice TIOBE anterior se ha actualizado constantemente durante más de una década (y algunos datos se remontan a 3 décadas) se supone que mide a los ingenieros que trabajan en cada idioma (aunque no tengo idea de cuán preciso es). De los 10 idiomas principales, excepto Java / Visual Basic, refleja lo que la gente en mi tienda sabe (aunque nuestras proporciones serán ligeramente diferentes ya que tenemos un tamaño de muestra mucho más pequeño).

Loki Astari
fuente
1
Esta respuesta me confunde ... sigues con C # y luego muestras etiquetas de preguntas SO, pero nada de eso tiene nada que ver con que se use C. La popularidad (especialmente en langpop, donde usan consultas de motores de búsqueda para determinar la popularidad) realmente no muestra el uso moderno de un idioma, solo las búsquedas modernas en un idioma. Debe tener en cuenta, para las búsquedas, que C se usa con frecuencia en las universidades para las clases de nivel inferior para que pueda aumentar el número de consultas y también las publicaciones SO.
Jetti
3
@Jetti: Por eso digo explícitamente: I am sure none of this is authoritative but we can use it to see trendsPero no estoy de acuerdo con tu segunda declaración; C ya no es el idioma principal que se enseña en los institutos de educación superior (si lo fuera, el nuevo grupo de graduados no sería tan inútil). La gente tiende a aprender Java / C # sharp hoy en día. Además, el informe Tiobe trata sobre trabajos, no consultas.
Martin York
Mirando hacia atrás, parece que hay una mala elección de palabras de mi parte. No quise decir las clases de números bajos (clases iniciales), quise decir que las clases de sistemas (arquitectura de computadora) es donde se usa C.
Jetti
44
El recuento de etiquetas SO no define la popularidad del idioma en general, simplemente muestra la popularidad del idioma entre los usuarios de SO .
Ed S.
44
@Ed S. Obviamente. Pero la pregunta no es sobre popularidad. Se trata de la existencia de C como lenguaje. El recuento de etiquetas SO nos muestra que definitivamente no es un idioma muerto. El hecho de que C esté en el top 2 en los otros sitios no lo convierte en el primer / segundo lenguaje más utilizado. Pero su existencia en el top 10 es un marcador significativo de que no está muerto. Por supuesto, nada de esto es prueba de fuertes indicadores de que C todavía se está utilizando activamente.
Martin York
23

Es posible que deba usar C cuando tenga pocos recursos y no necesite capacidades orientadas a objetos.

Muchos softwares en uso hoy en día todavía están escritos en C, sin mencionar los controladores de hardware.

Según el índice Tiobe , C sigue siendo el lenguaje más utilizado.


Como sugirió tcrosley, es posible que desee echar un vistazo a esta pregunta relacionada .


También debe verificar algunos artículos relacionados sobre las diferencias entre C y C ++, como este wiki o este, por ejemplo.

Jose Faeti
fuente
44
ejem !! Ese es un gran punto. Nunca pensé que "las capacidades de OOP realmente agregan gastos generales para el lenguaje". Gracias por dejar en claro este punto válido. Ahora, puedo entender, donde C está por delante de los demás
Pankaj Upadhyay
77
@Pankaj C ++ generalmente no necesariamente agrega mucha sobrecarga de tiempo de ejecución, gran parte de la complejidad del lenguaje es el principio de "no pagar por lo que no usa": si no usa excepciones, entonces las excepciones no disminuya la velocidad o agregue tamaño a su código. Sin embargo
Martin Beckett el
2
re C en el campo incrustado, vea también esta pregunta y respuestas: programmers.stackexchange.com/questions/84514/…
tcrosley
66
En realidad, nunca necesita capacidades OOP, simplemente funciona bien en algunos escenarios.
Ed S.
2
@Jose Faeti: Mi jefe estaría de acuerdo porque mi jefe es un tipo experimentado y racional. Él no compra la programación de la religión.
Ed S.
20

Parece que está tratando de convencerse de que C es inútil y, por lo tanto, puede ignorarse. Analicemos su pregunta:

"Pensé que alguien solo aprendería C para las pruebas solo si se realiza un desarrollo en C."

No, hay muchas razones para aprender C. Incluso si no supieras que aún evitaría usar declaraciones generales como esa, especialmente en conjunción con la lógica circular. Obviamente, uno necesita saber el idioma en el que está escrito el código para poder probarlo / corregirlo correctamente, pero eso supone que el idioma todavía se usa como un hecho y es cierto para cualquier idioma y no solo para C.

"En mi conocimiento, todo el desarrollo relacionado con COM y diseño de hardware también se realiza en C ++".

Eso es incorrecto.

"Por lo tanto, aprender C no tiene sentido si necesita usar C ++. Tampoco creo en el significado histórico, entonces, ¿por qué perder tiempo y dinero en aprender C?"

Esta es la lógica más cuestionable de todas. En primer lugar, la importancia histórica es algo en lo que debe creer, porque si lo supiera, sabría que C es un subconjunto de C ++ y, por eso, saber C puede ayudarlo a ser un mejor programador de C ++. Por supuesto, el C también influyó en la mayoría de los lenguajes que vinieron después, por lo que los beneficios no terminan ahí. Además, debido a que C es tan importante, no puede considerarse que solo tenga importancia histórica. Todavía se usa ampliamente y, por lo tanto, no se puede relegar a una posición secundaria como esa. Puede argumentar que no es un lenguaje que todo programador necesita usar y que tiene un conocimiento profundo y eso sería correcto, pero no construya su argumento diciendo que no cree algo sin examinar primero sus verdaderos méritos.

GonzoKnight
fuente
77
C es un subconjunto de C ++ , ¿es eso lo que querías decir? . C no es un subconjunto de C ++; de hecho son bastante diferentes. Sí, C ++ es una mejora de C, o a veces se denomina C con clases y OOP , pero decir que C es un subconjunto, no justifica
Pankaj Upadhyay
77
C ++ es principalmente un superconjunto de una versión anterior de C, y C ha ido en una dirección algo diferente desde entonces. Algunos aspectos de los lenguajes han ido en direcciones en gran medida paralelas, pero otros no (y C ++ tiene muchas otras cosas además).
Donal Fellows
Estoy de acuerdo en votar para aclarar ese hecho, no todos los programas válidos de C son programas válidos de C ++, es decir, C ++ no es un superconjunto de C. Sin embargo, es un superconjunto de cómo C estaba en el momento de tomar la decisión de que fuera un superconjunto, como mencionó Donal Fellows. Simplemente no tiene sentido decir que ya no lo es, cuando ya no es cierto.
Joshua Hedges
16

Además de los sistemas embebidos, la mayoría de los lenguajes más nuevos tienen alguna forma de interactuar con C. Al escribir una biblioteca que desea que sea fácil de usar en todos esos lenguajes, C es una opción obvia. C ++, aunque también puede interactuar con algunos idiomas (como Python (solo CPython)), C ++ no puede interactuar con una mayor cantidad de idiomas debido a algunas de sus características (especialmente el cambio de nombre, pero las plantillas no ayudan al problema). El C ABI es uno de los más fáciles de interactuar (sé que puedes escribir C ++ y usar "C" externa para la interfaz. No me importa).

También tiene la ventaja de que C y C ++ son realmente los mejores lenguajes para la programación de sistemas y los tiempos de compilación de C son mucho más rápidos. Los tiempos de compilación de C ++ son notablemente los peores de cualquier lenguaje que haya usado.

Ahora bien, aunque hay otros lenguajes que quieren convertirse en el lenguaje de sistemas más popular (sé sobre D en particular), una gran mayoría de software está escrito en C / C ++. Los lenguajes como D requieren que alguien cree un contenedor alrededor de la biblioteca C en lugar de usarlo directamente (como lo haría con C ++).

jsternberg
fuente
D puede llamar al código C directamente, al igual que C ++. Todo lo que necesitas si la función prototipo (de nuevo, al igual que C ++). Simplemente escribe extern(C)en D, mientras que en C ++ escribeextern "C"
Peter Alexander
@ Peter Alexander Soy consciente de extern (C) en D. A eso me refería cuando dije el archivo contenedor. No puede incluir directamente el encabezado C (lo que puede hacer en C ++, suponiendo que el encabezado C usa "C" externa y tiene los bloques #ifdef __cplusplus, que la mayoría lo hace). Luego, existen otras incompatibilidades entre simplemente usar extern (C) (particularmente cómo se manejan las cadenas. Que yo sepa, no tienen un terminador nulo en D. Por lo tanto, debe cambiar especialmente la matriz al pasarla a C).
jsternberg
11

echa un vistazo a langpop.com , especialmente los gráficos de Freshmeat y Google Code. Muestra que C todavía está muy por delante.

C sigue siendo popular en los sistemas en los que necesita estar cerca del metal (es decir, el sistema integrado) y las aplicaciones que requieren mucho rendimiento.

tehnyit
fuente
44
¡NO ABRA esta URL! El sitio web ya no existe y la URL redirige a algunas páginas de spam molestas.
Nikolay Suvandzhiev
11

Lo uso casi todos los días desarrollando para iPad / iPhone. Muchas bibliotecas están escritas en C y no tienen un equivalente de Objective-C. Entonces sí, todavía se usa y es uno de los dispositivos más nuevos del mercado.

Con C, puede programar muchos sistemas embebidos, es pequeño y práctico, y probablemente seguirá existiendo durante muchos años (es decir, no perderá tiempo ni dinero aprendiéndolo)

Valentin Radu
fuente
2
"Objective-C es todavía joven" en realidad es de mediados de los años 80, casi tan viejo como C ++. Sin embargo, la mayoría de las personas que lo usan no lo descubrieron hasta 2007.
Es cierto que lo que quería decir es básicamente que hay muchas bibliotecas C que no tienen un equivalente en Objective-C para iOS. De hecho, el lenguaje en sí mismo no es para nada joven (verificado con Wiki). Gracias por señalar eso.
Valentin Radu
7

En general, para el sistema embebido, C todavía se usa ampliamente.

Esta pregunta da otro ejemplo.

El índice Tiobe , que intenta clasificar el lenguaje por popularidad / uso , consistentemente coloca a C en primer lugar.

Xavier T.
fuente
2do lugar (después de Java).
Martin York
77
Es interesante que C ++ y Java parezcan tener una tendencia a la baja en los últimos 10 años, mientras que C sigue siendo más o menos estático.
Paul R
7

Portabilidad.

Haga una lista de todos los sistemas que cree que ejecutarán el código C y luego una lista similar para cada otro idioma que desee.

Si se te ocurrió la misma respuesta que yo, entonces la conclusión es sí.

tidbeck
fuente
5

Bueno, creo que C es el lenguaje más poderoso ¡Debido a las siguientes razones!

1) EN la primera C, es un lenguaje de sistemas (lo que significa que puede usarse para hacer programación de bajo nivel con un tiempo de ejecución mínimo o nulo).

2) Velocidad de la aplicación resultante. El código fuente de C se puede optimizar mucho más que los lenguajes de nivel superior porque el conjunto de idiomas es relativamente pequeño y muy eficiente. Es lo más parecido a la programación en lenguaje ensamblador, sin programar en lenguaje ensamblador. ¡e incluso puedes usar ensamblaje y C juntos!

3) C tiene cuál es su aplicación en la programación de Firmware (hardware). Esto se debe a su capacidad de usar / trabajar con ensamblaje y comunicarse directamente con controladores, procesadores y otros dispositivos.

4) C es un bloque de construcción para muchos otros lenguajes conocidos actualmente. Busque la historia de C y encontrará que ha existido por algún tiempo (ya que los lenguajes de programación funcionan de todos modos). Eche un vistazo a Python, por ejemplo, un lenguaje de programación de alto nivel totalmente orientado a objetos. Está escrito en C (quizás también en C ++). Eso te dice si alguna vez quieres saber qué está pasando bajo el capó en otros idiomas; Comprender C y cómo funciona es esencial.

Se utiliza un lenguaje de aplicaciones para la programación de alto nivel, por ejemplo, escribir un procesador de textos o un juego. Ejemplos de lenguajes de aplicaciones son Java, C #. La razón es porque contienen recolección de basura, tipeo automático, validación de tiempo de ejecución, etc., donde el foco es la productividad.

Se utiliza un lenguaje de sistemas para la programación de bajo nivel. Por ejemplo, un microcontrolador, un controlador y un núcleo del sistema operativo. Los ejemplos incluyen ensamblaje, C. Requieren poco o ningún tiempo de ejecución para ejecutar el código directamente en el hardware, y el objetivo es que el programador tenga control directo sobre el hardware.

En general, está disminuyendo como lenguaje de aplicaciones, pero sigue siendo fuerte como lenguaje de sistemas.

niko
fuente
1

Oh sí, se usa. Trabajo en el campo del procesamiento de paquetes de red. He estado en dos compañías diferentes donde procesamos paquetes de red. Por lo tanto, estamos operando en el nivel de Ethernet o IP, no en el nivel por encima de TCP.

Curiosamente, en ambas compañías C fue elegido sobre C ++. En una de las compañías, uno de los dos productos se creó sobre el núcleo de Linux, mientras que el otro producto se creó en el espacio de usuario de Linux. El producto del kernel obviamente usó C ya que el kernel de Linux está programado en C, pero también eligieron usar C para el producto del espacio de usuario. Ambos productos se desarrollaron a partir del año 2000 aproximadamente (el producto del núcleo un poco antes del 2000 y el producto del espacio del usuario un poco después del 2000).

En la compañía a la que fui después de eso, el producto se creó en C, no en C ++. En realidad, es una continuación de un proyecto de mediados de la década de 1990, aunque debido a las recientes demandas de mejora del rendimiento, se decidió que esencialmente todo se reescribirá. Teníamos una opción para seleccionar C ++ debido a esta reescritura, pero no lo hicimos.

En el campo del procesamiento de paquetes de red, el rendimiento cuenta mucho. Por lo tanto, quiero implementar mi propia tabla hash que tenga un mayor rendimiento que las tablas hash existentes. Yo, no el autor de la tabla hash, soy quien selecciona qué función hash se va a utilizar. Tal vez quiero rendimiento e ir a MurMurHash3 . Quizás quiero seguridad y voy por SipHash . Los asignadores de memoria son obviamente personalizados. De hecho, todas las estructuras de datos importantes que utilizamos se han implementado a medida para obtener el mayor rendimiento posible.

Si bien no hay nada que impida el uso de C ++, generalmente es una mala idea. ¡Una sola excepción lanzada por paquete reducirá la velocidad de procesamiento de paquetes a niveles inaceptables! Por lo tanto, no podemos usar las excepciones de C ++. Demasiado lento. Ya estamos utilizando una especie de código C orientado a objetos implementando estructuras de datos como estructuras y luego implementando funciones que operan en esas estructuras. C ++ permitiría tener funciones virtuales, pero nuevamente las llamadas a funciones virtuales matarían el rendimiento si se usaran en todas partes. Por lo tanto, es mejor ser explícito y tener un puntero de función si se necesitan llamadas a funciones virtuales.

C ++ hará muchas cosas a sus espaldas: asignación de memoria, etc. Por otro lado, en C eso generalmente no sucede. Puede escribir una función que asigne memoria, pero por lo general se deduce de la interfaz de la función que está ocurriendo la asignación.

Como ejemplo del tipo de microoptimizaciones que puede hacer al programar en C, eche un vistazo a la macro container_of en el kernel de Linux. Claro, podría usar container_of en código C ++, pero ¿quién lo hace? Quiero decir, es totalmente aceptable en la mayoría de los programas de C, pero los programadores típicos de C ++ propondrán inmediatamente otra cosa, como una lista vinculada que asigna los nodos de enlace como bloques separados. No queremos eso porque cada bloque de memoria asignado es malo para el rendimiento.

Quizás lo único que nos beneficiaría en C ++ es que C ++ permite la metaprogramación de plantillas, lo que significa que a veces puede evitar las llamadas a funciones virtuales mientras todavía tiene un parámetro de función, y permitir que el compilador incorpore las funciones. Pero la metaprogramación de plantillas es complicada y hemos logrado cumplir con todos los requisitos en C, por lo que el beneficio de esta función en C ++ no es tan crítico.

En una de las compañías, en realidad teníamos un lenguaje compilado personalizado en el que se implementaron parte de las características. ¿Adivinen cuál era el idioma de destino del compilador? ¿Montaje? No, tuvimos que admitir arquitecturas de 32 bits y de 64 bits. C ++? Seguramente bromeas. Obviamente, era C con el goto calculado de GCC . Por lo tanto, el lenguaje personalizado se compiló en C (o en realidad la variante gcc de C que admitía goto calculado), y el compilador de C produjo el ensamblado.

juhist
fuente
0

Todavía uso C a diario y una de las razones principales es la interoperabilidad con otros lenguajes y un SDK diseñado para ser utilizado por complementos creados por todo tipo de compiladores en varios idiomas.

No puedo escribir una API de C ++ que use clases con constructores y destructores y vtables, sobrecarga de funciones, excepciones de lanzamiento, etc. que se pueden usar desde Lua, C #, Python, C, etc. y mucho menos un complemento de C ++ escrito usando diferentes compiladores y configuraciones de la nuestra.

No puedo escribir un SDK de C # que se pueda llamar desde Python, por ejemplo, o un SDK de Python que se pueda llamar desde C #.

C es el único lenguaje aquí que me permite crear una API a la que se puede llamar desde cualquiera de estos lenguajes. Dicho esto, a menudo uso C ++ para implementar estas interfaces C (aunque a veces solo las implemento en C).

Además de eso, a veces encuentro que C es el lenguaje más fácil para trabajar para cosas como estructuras de datos de bajo nivel y asignadores de memoria. Toda la seguridad de tipo adicional que obtiene en C ++ no ayuda si está escribiendo un asignador de memoria diseñado para agrupar bits y bytes alineados. Y contra el sistema de tipo rico de C ++ y el manejo de excepciones, no es fácil rodar sus propias estructuras de datos: solo mire cuánto esfuerzo se necesita para escribir una estructura de datos tan trivial como std::vectorsi desea hacerla segura para excepciones y evitar invocar ctors y dtors en elementos que no insertó en el contenedor (estoy hablando como uno que ha implementado toda la biblioteca estándar de C ++). Cuando una matriz ampliable es muy difícil de implementar bien, entonces imagine el trabajo requerido para implementar una BVH de calidad de producción.

Prefiero C ++ sobre C cuando quiero usar estructuras de datos existentes o implementar las de nivel superior usando las existentes, pero si voy a implementar una estructura de datos de bajo nivel en el núcleo de un motor que no tiene uso para Con las estructuras de datos existentes, C definitivamente hace que sea mucho más fácil hacerlo con su sistema de tipo súper simplista que le permite simplemente memcpycosas aquí y memmovecosas allá, mallocun bloque contiguo y reallocallí, sin preocuparse por los constructores, destructores y excepciones.

user204677
fuente