tipos programas librerias lenguaje funciones ejemplos dev definicion datos comandos codigos clases basicos c++ c++11 computer-architecture c++14

librerias - ejemplos de programas en c++ pdf



¿Qué características estándar de C++ se pueden usar para consultar la arquitectura de la máquina/SO? (4)

¿Cómo detecta la cantidad de RAM que tiene la computadora, la cantidad de RAM que usa el proceso, la cantidad de espacio en disco disponible para escribir en un directorio determinado o la cantidad de caché L2 disponible?

Usted no Precisamente nada de esto es el ámbito del lenguaje C ++, que describe una máquina abstracta.

La única razón por la que le indica el número de núcleos disponibles es porque, de lo contrario, su modelo de subprocesos múltiples sería casi inútil, e incluso así lo hace de una manera abstracta ("concurrencia de hardware" no es "número de CPU físicas en su escritorio ORDENADOR PERSONAL").

¿Cuáles son las funciones y utilidades estándar de C ++ para consultar las propiedades del hardware o las capacidades del sistema operativo en las que se ejecuta el programa?
Por ejemplo, std::thread::hardware_concurrency() le proporciona el número de subprocesos que admite la máquina.
Pero, ¿cómo detecta la cantidad de RAM que tiene la computadora, la cantidad de RAM que usa el proceso, la cantidad de espacio en disco disponible para escribir en un directorio determinado o la cantidad de caché L2 disponible?

Preferiría las respuestas por medio de los estándares c ++ ( c ++ 14 ), pero las propuestas TR2 o boost serían buenas.


" std::thread::hardware_concurrency() te da la cantidad de hilos que la máquina admite ..."

No, no lo hace. Para ser precisos ( citando desde aquí )

std::thread::hardware_concurrency() ... Devuelve el número de subprocesos simultáneos admitidos por la implementación. El valor debe ser considerado sólo una pista. ...
... Si el valor no está bien definido o no es computable, devuelve ​0 .

Lo mejor que puede hacer es informarle cuántos núcleos de CPU están disponibles para la ejecución paralela real de subprocesos (consulte @Lightness Races en la respuesta de Orbit aquí ).
Aún puede tener tantas instancias de subprocesos que desee, hasta que la adquisición falle.

"¿cómo se detecta la cantidad de RAM que tiene la computadora, o la cantidad de RAM que usa el proceso, ..."

Todas estas capacidades, como la RAM disponible, etc. dependen en gran medida de la máquina / sistema operativo, y no se pueden consultar con las funciones o clases estándar de c ++ (al menos no lo sé).

"... o cuánto espacio en disco está disponible para escribir en un directorio determinado, ..."

La biblioteca estándar de C ++ tampoco tiene la noción de un sistema de archivos o directorios ...

"... o cuánto caché L2 está disponible"

... y aún menos noción acerca de tales rasgos altamente específicos de MCU 1 .

C ++ utiliza una visión completamente abstracta, de arquitectura de máquinas y de sistemas operativos de su mundo.

1) Agradezca a DIOS, a Bjarne y al comité de estándares de c ++ por esto; de lo contrario, tendría serios problemas para escribir un código portátil a medias para los diversos objetivos a los que me enfrento. Si falla, y no se puede probar un error de mi parte que viole los estándares, es muy probable que sea un error de la implementación del compilador real. Eso, al menos, dificulta que mis codificadores salgan, para poder realizar intentos innecesarios y oscuros de micro optimización :-D.

Todo lo anterior dijo:

Lo más cercano que puede obtener, solicitando algunos rasgos básicos y capacidades de la arquitectura de la máquina utilizando los estándares actuales, es lo que se admite desde <cstddef> , <limits> y <type_traits> mi humilde opinión.

Aunque algunas de las definiciones estándar más recientes (p. Ej., Como std::thread , std::chrono o la biblioteca experimental de sistemas de archivos ) adoptaron algunas tecnologías y abstracciones comunes de "estado del arte" .


Como han señalado otros, las funciones para obtener tales propiedades del sistema son típicamente específicas de la plataforma. El STL y boost no proporcionan envoltorios independientes de la plataforma, por lo que tendrá que confiar en otras bibliotecas de terceros.

He utilizado con éxito SIGAR en el pasado:

La API de Sigar proporciona una interfaz portátil para recopilar información del sistema, como:

  • Memoria del sistema, intercambio, CPU, carga promedio, tiempo de actividad, inicios de sesión
  • Memoria por proceso, CPU, información de credenciales, estado, argumentos, entorno, archivos abiertos
  • Detección de sistema de archivos y métricas.
  • Detección de interfaz de red, información de configuración y métricas.
  • Tablas de conexión TCP y UDP
  • Tabla de rutas de red

Como nota al margen, Boost Filesystem realmente proporciona boost::filesystem::space para consultar "cuánto espacio en disco hay disponible para escribir en un directorio determinado".


La determinación de la cantidad de RAM o espacio en disco duro disponible es la funcionalidad a nivel de sistema operativo. Debido a que hay muchas estrategias diferentes disponibles para abordar esos problemas, no existe una plataforma independiente para obtener esa información. Las API para cualquier SO que esté desarrollando deben proporcionar una funcionalidad para determinar esos valores.

Por ejemplo, la API de Windows parece proporcionar esta función: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366589%28v=vs.85%29.aspx que puede ayudarlo a determinar cómo mucha memoria física / virtual está disponible.

Determinar la cantidad de espacio disponible en la memoria caché es un asunto diferente, la siguiente respuesta podría ayudarlo: https://.com/a/12838695/3798126