¿Gestión de memoria global en C++ en pila o montón?

Resuelto sameer karjatkar asked hace 15 años • 9 respuestas

Si declaro una estructura de datos globalmente en una aplicación C++, ¿consume memoria de pila o memoria de montón?

Por ejemplo

struct AAA
{

.../.../.
../../..
}arr[59652323];
sameer karjatkar avatar Jul 23 '09 12:07 sameer karjatkar
Aceptado

Como no estaba satisfecho con las respuestas y espero que el mismo karjatkar quiera aprender más que una simple respuesta de sí o no, aquí lo tiene.

Normalmente, un proceso tiene cinco áreas diferentes de memoria asignadas.

  1. Código - segmento de texto
  2. Datos inicializados: segmento de datos
  3. Datos no inicializados – segmento bss
  4. Montón
  5. Pila

Si realmente desea saber qué se guarda y dónde, lea y márquelo como favorito:

COMPILADOR, ENSAMBLADOR, ENLAZADOR Y CARGADOR: UNA BREVE HISTORIA (ver Tabla w.5)

Anatomía de un programa en memoria

texto alternativo

Milan avatar Jul 23 '2009 12:07 Milan

El problema aquí es la pregunta. Supongamos que tienes un pequeño programa en C (++ también, lo manejan de la misma manera) como este:

/* my.c */

char * str = "Your dog has fleas.";  /* 1 */
char * buf0 ;                         /* 2 */

int main(){
    char * str2 = "Don't make fun of my dog." ;  /* 3 */
    static char * str3 = str;         /* 4 */
    char * buf1 ;                     /* 5 */
    buf0 = malloc(BUFSIZ);            /* 6 */
    buf1 = malloc(BUFSIZ);            /* 7 */

    return 0;
}
  1. Esto no está asignado en la pila NI en el montón. En cambio, se asignan como datos estáticos y se colocan en su propio segmento de memoria en la mayoría de las máquinas modernas. La cadena real también se asigna como datos estáticos y se coloca en un segmento de solo lectura en máquinas con pensamiento correcto.
  2. es simplemente un puntero asignado estático; espacio para una dirección, en datos estáticos.
  3. tiene el puntero asignado en la pila y será desasignado efectivamente cuando mainregrese. La cadena, como es una constante, se asigna en un espacio de datos estático junto con las otras cadenas.
  4. en realidad se asigna exactamente como en 2. La staticpalabra clave le indica que no se debe asignar en la pila.
  5. ...pero buf1está en la pila, y
  6. ... el espacio del búfer mal asignado está en el montón.
  7. Y por cierto, los niños no intentan esto en casa. malloctiene un valor de retorno de interés; Siempre debes verificar el valor de retorno.

Por ejemplo:

char * bfr;
if((bfr = malloc(SIZE)) == NULL){
   /* malloc failed OMG */
   exit(-1);
}
Charlie Martin avatar Jul 23 '2009 06:07 Charlie Martin

Normalmente no consume ninguno de los dos. Intenta asignarlos en un segmento de memoria que probablemente mantenga un tamaño constante para la ejecución del programa. Puede ser bss, pila, montón o datos.

Tomek Kopczuk avatar Jul 23 '2009 06:07 Tomek Kopczuk

Ni. Es la sección .data.

EFraim avatar Jul 23 '2009 06:07 EFraim