¿Gestión de memoria global en C++ en pila o montón?
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];
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.
- Código - segmento de texto
- Datos inicializados: segmento de datos
- Datos no inicializados – segmento bss
- Montón
- 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
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;
}
- 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.
- es simplemente un puntero asignado estático; espacio para una dirección, en datos estáticos.
- tiene el puntero asignado en la pila y será desasignado efectivamente cuando
main
regrese. La cadena, como es una constante, se asigna en un espacio de datos estático junto con las otras cadenas. - en realidad se asigna exactamente como en 2. La
static
palabra clave le indica que no se debe asignar en la pila. - ...pero
buf1
está en la pila, y - ... el espacio del búfer mal asignado está en el montón.
- Y por cierto, los niños no intentan esto en casa.
malloc
tiene 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);
}
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.
Ni. Es la sección .data.