¿Gestión de memoria global en C ++ en stack o heap?

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

Por ej.

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 sí / no, aquí tiene.

Normalmente, un proceso tiene asignadas 5 áreas diferentes de memoria

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

Si realmente quiere saber qué se guarda, entonces lea y marque estos:

COMPILADOR, ENSAMBLE, ENLACE Y CARGADOR: UNA BREVE HISTORIA (vea la Tabla w.5)

Anatomía de un progtwig en memoria

texto alternativo http://www.tenouk.com/ModuleW_files/ccompilerlinker006.png

El problema aquí es la pregunta. Supongamos que tienes un pequeño progtwig C (++ también, ellos manejan esto 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 stack NI en el montón. En cambio, se asigna como datos estáticos y se coloca 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 de pensamiento correcto.
  2. es simplemente un puntero estático asignado; espacio para una dirección, en datos estáticos.
  3. tiene el puntero asignado en la stack y será desasignado de manera efectiva cuando se registre la devolución main . La cadena, dado que es una constante, se asigna en el espacio de datos estáticos junto con las otras cadenas.
  4. en realidad se asigna exactamente como en 2. La palabra clave static le dice que no se debe asignar a la stack.
  5. … pero buf1 está en la stack, y
  6. … el espacio de búfer malloc’ed está en el montón.
  7. Y, por cierto, los niños no prueban 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); } 

Por lo general, no consume ninguno. Intenta asignarlos en un segmento de memoria que probablemente permanezca en tamaño constante para la ejecución del progtwig. Puede ser bss, stack, heap o data.

Ninguno. Es una sección de datos.

La memoria global se asigna previamente en un bloque de memoria fija, o en el montón, dependiendo de cómo lo asigna su aplicación:

 byte x[10]; // pre-allocated by the compiler in some fixed memory block byte *y main() { y = malloc(10); // allocated on the heap } 

EDITAR :

La pregunta es confusa: si asigno una estructura de datos globalmente en una aplicación C ++, ¿consume memoria de stack o memoria de stack?

“asignar”? Eso podría significar muchas cosas, incluso llamar a malloc (). Hubiera sido diferente si la pregunta fuera “si declaro e inicializo una estructura de datos globalmente”.

Hace muchos años, cuando las CPU todavía usaban segmentos de 64K, algunos comstackdores eran lo suficientemente inteligentes como para asignar dinámicamente la memoria del montón en lugar de reservar un bloque en el segmento .data (debido a las limitaciones en la architecture de la memoria).

Supongo que soy demasiado viejo …

Ni declarar una estructura de datos globalmente en un C ++ consume stack o memoria de stack. En realidad, las variables globales generalmente se asignan en un segmento de datos cuyo tamaño permanece sin cambios durante todo el progtwig. Las stacks y los montones se usan generalmente para las variables que se crean y se destruyen durante la ejecución del progtwig.

Espacio de memoria del programa

El objeto global en sí mismo ocupará la memoria que el tiempo de ejecución o el comstackdor reserven para él antes de que se ejecute main, esto no es un costo de tiempo de ejecución variable, así que ni astack ni acumula.

Si el ctor del objeto asigna memoria, estará en el montón, y cualquier asignación posterior por parte del objeto será asignaciones de stack.

Depende de la naturaleza exacta del objeto global, si es un puntero o el objeto entero en sí es global.

las variables globales viven en el montón. estos son un caso especial porque viven durante la vida del progtwig

Si asigna explícitamente la memoria usted mismo por nuevo o malloc, entonces se asignará en el montón. Si el comstackdor está asignando la memoria, entonces se asignará en la stack.