¿Es una práctica común que los programadores / ingenieros de software usen punteros para controlar cualquier parte de sus computadoras, por ejemplo, RAM, GPU, sensores, etc.? ¿O hay funciones / métodos en ciertas bibliotecas, por ejemplo, OpenCL para GPU, que ya lo hacen?

Vi su pregunta anterior y ahora esta y quería ver si podía aclarar por qué C ++ y los punteros se usan más claramente. C / C ++ no es un lenguaje administrado. Si necesito memoria para almacenar mi clase de auto en ram, necesito punteros y el nuevo operador. El nuevo operador asigna memoria. Tiene algo de memoria que no tiene que asignar en ningún programa de c ++. Esta es tu memoria de pila. Las funciones ocupan memoria de pila cuando se llaman. Muchas variables más pequeñas, como contadores simples en bucles for, como (para int a = 0; a <max; a ++) bien a están en la pila. Pero solo obtienes tanta memoria de pila porque está preasignada cuando se inicia el programa y no puede crecer. Entonces digamos que obtienes dos megas. Pero, ¿qué pasa si mi programa quiere descargar cosas y almacenarlas en la memoria y la computadora en la que estoy tiene 4 gigabytes de RAM y quiero usar un gigabyte o incluso unas pocas docenas de megabytes? Necesito usar la memoria del montón o punteros en c ++. La memoria de pila no debe usarse para el almacenamiento de datos a gran escala. Hay un sitio de programación popular que lleva el nombre de lo que sucede cuando se excede la cantidad fija de memoria de la pila, el desbordamiento de la pila y se bloquea.

También quiero ser claro. En C ++, no es como si simplemente pudieras “usar una biblioteca o un marco preexistente” para cualquier cosa que necesite administración de memoria directa. Si bien es excelente usar bibliotecas para soluciones existentes si su programa no es solo una colección de marcos y tiene un código personalizado que debe, la forma en que funciona C ++ usa punteros y administración de memoria directa si desea usar cualquier cosa menos una cantidad trivial de memoria a través de sus variables o estructuras de datos. No hay forma de acceder a la memoria de almacenamiento dinámico en c / c ++ excepto a través de un puntero y el nuevo operador que asigna en la sintaxis de c ++ o malloc en la sintaxis de C. Y el programador es responsable de liberar, eliminar o liberar esta memoria más tarde o si tiene una pérdida de memoria.

Sin embargo, existen riesgos que operan tan cerca del hardware. En Java o C # o Ruby on Rails estás escribiendo código interpretativo. En Java, la aplicación java.exe que obtiene de Oracle o su entorno Java Run Time toma el código interpretativo y maneja la memoria de sus programas y ejecuta las instrucciones a nivel de máquina. .Net funciona de la misma manera y es por eso que el framework .net debe descargarse si aún no es para ejecutar los idiomas .net o el intérprete necesario está en el servidor. Esto significa que no hay las mismas preocupaciones sobre el uso de objetos que han desasignado su memoria o lo que se conoce como puntero colgante. No hay los mismos riesgos de olvidar liberar memoria y tener pérdidas de memoria. Y lenguajes como Java o .net también usan memoria Heap todo el tiempo. No puede hacer un objeto de una clase en Java que no use memoria de montón, que es una protección segura contra el desbordamiento de la pila. Solo que, a diferencia de C ++, el programador no tiene que administrar esa memoria ni determinar cuándo desasignarla. Entonces, ¿por qué diablos alguien usa punteros y C ++ y administración de memoria directa?

Bueno, esa capa interpretativa ralentiza el programa. Para muchos programas se ejecutan tan rápido y no necesitan mucha CPU, no importa y el usuario no percibe los gastos generales. Pero muchos tipos de programas como los juegos quieren velocidad y muchos más.

Android dijo desde el principio que vamos a jugar de forma segura y solo permitiremos que las aplicaciones de Android usen Java. Argumentaron que Java era lo suficientemente avanzado. Pero tuvieron una reacción violenta. Los desarrolladores de juegos móviles dijeron que Android no puede competir con el buen rendimiento en iOS que permite c ++ u objectivo-c. Así que Google cedió ahora, puedes usar c / c ++ en Android a través del NDK.

¿Alguien más que los juegos usan C ++ y administración de memoria directa? Pues mucho. Permítanme compartir algunos de los programas de esta lista que encontré. Aplicaciones C ++

Adobe Systems : todas las aplicaciones principales se desarrollan en C ++:

Autodesk : una gran cantidad de aplicaciones importantes en el dominio CAD

Google : motor de búsqueda web, etc.

  • Navegador de cromo.
  • Sistema de archivos de Google.
  • MapReduce procesamiento de datos de clúster grande.
  • Intuit : Quicken (software financiero personal).

Y muchos otros, incluidos muchos sitios web de alta potencia, desde Facebook hasta Amazon, lo usan para varias cosas que necesitan velocidad.

Editar: gran parte del lado web es interpretativo, excepto que muchos de los sitios principales reales como se mencionan usan C ++ en el lado del servidor de fondo. Chrome está escrito en C ++ pero Chrome interpreta el Javascript, CSS y HTML en la página y maneja su memoria. Las demandas de CPU de una página web a menudo no son tan altas como las aplicaciones a gran escala, por lo que la pérdida de velocidad es aceptable. Una página web suele obtener y generar gráficos y diseños, y procesa clics e información que proviene de un servidor y sus bases de datos. La búsqueda en Google obviamente es computacionalmente intensiva, pero gran parte de la web es más liviana en el lado del código, por lo que la velocidad solo debe estar en las búsquedas de la base de datos para muchos sitios web más simples.

Depende de su trabajo diario, idioma, sistema operativo y controladores que esté utilizando.

Soy desarrollador de C ++, y aunque uso punteros para código heredado (esto incluye controladores para su GPU, sensores), es más común usar punteros inteligentes hoy en día. Técnicamente, los punteros inteligentes no son punteros en sí mismos, sino que son construcciones para administrar los punteros de forma segura para mí. ¿También percibes que usar referencias es lo mismo que usar punteros?

Supongo que para la programación en C, si está escribiendo funciones reutilizables, es probable que comience a usar punteros para pasar las cosas para evitar copiar por todas partes. Algunos proyectos integrados prohíben el uso de punteros debido a los riesgos de error del programador, pero no creo que estos proyectos se consideren “comunes”, ya que estos proyectos suelen ser para sistemas críticos de seguridad.