Pregunta

En C ++, el especificador de clase de almacenamiento estático asigna memoria del área de datos. ¿Qué significa " área de datos " significa?

¿Fue útil?

Solución

Además de lo que dijo Konrad, declarar una variable como estática básicamente significa que la memoria para ella se asigna con el programa a medida que se carga, en lugar de hacerlo en el montón o en la pila. Históricamente, el uso de solo variables estáticas en aplicaciones críticas significaba que la huella de memoria de la aplicación no cambiaría en tiempo de ejecución y, por lo tanto, era menos probable que fallara debido a limitaciones de recursos. No sé si esto sigue siendo cierto para los sistemas operativos modernos.

Si logra que su compilador genere un archivo de mapas como parte de su salida, puede echar un vistazo a lo que se encuentra en las distintas secciones, incluidos los datos.

Otros consejos

No estoy familiarizado con el término "área de datos" pero la memoria a menudo se divide en "sección de código" y "sección de datos". El código reside en el primero, los datos en el segundo. Supongo que esto es lo que se entiende aquí.

Clásicamente, no hay distinción entre los dos. Sin embargo, muchos sistemas operativos modernos pueden prohibir la ejecución de código en el segmento de datos (siempre que la CPU admita esta distinción). Esto a veces va por el eslogan de "bandera NX", como en "no ejecución" y puede prevenir efectivamente algunos casos de inyección de código malicioso.

/ EDIT: observe que el estándar C ++ no menciona un "área de datos".

Los nombres de las áreas varían según la plataforma, el compilador y el enlazador.

En general, hay:

  • texto del programa: el espacio de código ejecutable.
  • constantes: constantes no ejecutables.
  • pila: la pila.
  • bss: en términos generales " estadísticas " en términos de C / C ++. " Bloque iniciado por símbolo "
  • datos: globales sin inicializar
  • montón: almacenamiento asignado en tiempo de ejecución.

En este caso, la documentación en cuestión está utilizando el nombre " área de datos " por lo que tradicionalmente se llama el segmento bss.

En términos de C, el especificador de clase de almacenamiento " static " significa la memoria que existe durante la vida útil del programa y se inicializa a cero o el valor del inicializador. En el ejemplo:

static int s_value_one;
static int s_value_two = 123;

Se garantiza que el valor de s_value_one es cero y el valor de s_value_type es 123 en el punto de la primera declaración en main (). Cómo esto llega a ser verdad es un problema de implementación.

Lo que dijo Konrad.

Me gustaría agregar que todavía hay CPU que no pueden leer datos si están colocados en la sección de códigos y viceversa. Estas han sido más comunes hace décadas, pero todavía están vivas en el mundo incrustado.

En pocas palabras, el enlazador solo agrupa símbolos de igual tipo. En la PC, a menudo tiene incluso más que simples áreas de código y datos. Encontrará áreas para datos no inicializados, datos de solo lectura y otras cosas que dependen del sistema operativo también.

Hay muchos lugares donde los datos pueden terminar. Por lo general, las variables locales se asignan en la pila, y puede asignar cosas en el montón usando malloc (o la versión predeterminada de 'nuevo'). Sin embargo, los datos estáticos, por lo general, se asignan cuando se inicia el programa y pueden terminar en cualquier lugar, donde el compilador, el sistema operativo y el formato ejecutable dependen exactamente del mismo.

El ejecutable tiene mucha información.

Un ejecutable, tiene muchos tipos / clases de datos almacenados dentro de su archivo físico.

por ejemplo, son

  1. Instrucciones de código ejecutable
  2. Recursos
  3. Información de dependencia (de la que depende este binario)
  4. Los símbolos que se exportan desde este binario

etc

Debe haber alguna forma de organización

toda esta información dentro del formato de archivo .exe para que el sistema operativo pueda encontrar fácilmente toda la información, cargar el archivo ejecutable y hacer que todo funcione. Para este propósito, se utiliza un formato binario común (creado por M $ de curso) llamado PE (ejecutable portátil) en el mundo de Windows. Toda la información que acabo de enumerar (y muchas más) se describe en detalle en diferentes secciones del binario.

sección de datos

Una de estas secciones es la sección .data. La sección .data contiene todos los datos globales y estáticos inicializados, mientras que la sección .bss contiene los datos globales sin inicializar.

¿Por qué necesita una sección separada para los globales?

Bueno, un global se comporta como un global porque se crea en un área de memoria que existe durante la vida útil de un programa y no es una estructura de datos temporal como una pila que se puede sobrescribir o reutilizar. (como las variables automáticas normales).

Compilador

Por lo tanto, estas variables deben asignarse en alguna dirección permanente en el montón, que desafortunadamente no se puede conocer en el momento de la compilación. Así que el compilador coloca todas las variables globales y estáticas en esta sección .data / .bss, y las instrucciones que se refieren a estas variables se refieren a estas direcciones relativamente permanentes en los .data / .bss.

Linker

Cuando el vinculador carga el archivo ejecutable en el mundo real, decide dónde se deben colocar estas secciones y crea FIX UP para estas direcciones temporales, de modo que las instrucciones que se refieren a los globales se refieran a las direcciones virtuales ahora reales en los programas. memoria.

Ahora sabe qué es la sección / área de datos. Por qué es necesario asignar un espacio en esa área a las áreas globales y cómo eso ayuda al programa en tiempo real. El formato de Google PE, el enlazador y la sección .data, etc., te darán los enlaces.

Creo que 'área de datos' se refiere al montón, mientras que las variables locales normalmente se ubicarán en la pila.

O significa que la memoria asignada para esta variable se encuentra en la sección .data del ejecutable, pero eso sería específico para Windows y el formato PE.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top