new diferencia allocate c++ memory-management stack

c++ - allocate - heap vs stack diferencia



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

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. Apilar

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 programa en memoria

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

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

Por ej.

struct AAA { .../.../. ../../.. }arr[59652323];


El objeto global en sí mismo ocupará la memoria que el tiempo de ejecución o el compilador reserven para él antes de que se ejecute main, esto no es un costo de tiempo de ejecución variable, así que ni apila 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 pila.

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


El problema aquí es la pregunta. Supongamos que tienes un pequeño programa 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 pila 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 pila 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 pila.
  5. ... pero buf1 está en la pila, 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); }


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 pila o memoria de pila?

"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 compiladores 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 arquitectura de la memoria).

Supongo que soy demasiado viejo ...


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


Ninguno. Es una sección de datos.


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 programa. Puede ser bss, stack, heap o data.


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


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