Diferencia entre la asignación de memoria estática y la asignación de memoria dinámica


Me gustaría saber cuál es la diferencia entre la asignación de memoria estática y la asignación de memoria dinámica?

¿Podría explicar esto con algún ejemplo?

Author: vaultah, 2011-12-05

7 answers

Hay tres tipos de asignación estática, automática y dinámica.

Static Allocation significa que la memoria para sus variables se asigna cuando se inicia el programa. El tamaño se fija cuando se crea el programa. Se aplica a variables globales, variables de ámbito de archivo y variables calificadas con static definidas dentro de funciones.

La asignación automática de memoria se produce para variables (no estáticas) definidas dentro de funciones, y generalmente se almacena en pila (aunque el estándar C no exige que se use una pila). Usted no tiene que reservar memoria adicional con ellos, pero por otro lado, también tienen un control limitado sobre la vida útil de esta memoria. Por ejemplo: las variables automáticas en una función solo están allí hasta que la función termine.

void func() {
    int i; /* `i` only exists during `func` */
}

La asignación dinámica de memoria es un poco diferente. Ahora puede controlar el tamaño exacto y la vida útil de estas ubicaciones de memoria. Si no lo liberas, tendrás pérdidas de memoria, lo que puede causar que su aplicación se bloquee, ya que en algún momento, el sistema no puede asignar más memoria.

int* func() {
    int* mem = malloc(1024);
    return mem;
}

int* mem = func(); /* still accessible */

En el ejemplo superior, la memoria asignada sigue siendo válida y accesible, aunque la función haya terminado. Cuando termines con la memoria, tienes que liberarla:

free(mem);
 63
Author: Constantinius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-03 09:49:05

Esta es una pregunta estándar de entrevista:

Asignación dinámica de memoria

Se asigna memoria en tiempo de ejecución utilizando calloc(), malloc() y amigos. A veces también se conoce como memoria' heap', aunque no tiene nada que ver con la estructura de datos de heapref..

int * a = malloc(sizeof(int));

La memoria del montón es persistente hasta que se llama free(). En otras palabras, usted controla la vida útil de la variable.

Asignación automática de memoria

Esto es lo que es comúnmente conocida como memoria' stack', y se asigna cuando se ingresa un nuevo ámbito (generalmente cuando se empuja una nueva función en la pila de llamadas). Una vez que se sale del ámbito, los valores de las direcciones de memoria automáticas no están definidos, y es un error acceder a ellos.

int a = 43;

Tenga en cuenta que el alcance no significa necesariamente función. Los ámbitos pueden anidarse dentro de una función, y la variable estará dentro del ámbito solo dentro del bloque en el que fue declarada. Tenga en cuenta también que donde esta memoria es allocated is not specified. (En un sistema sano estará en la pila, o se registrará para la optimización)

Asignación de memoria estática

Se asigna en tiempo de compilación, y la vida de una variable en memoria estática es la vida del programa.

En C, la memoria estática se puede asignar usando la palabra clave static. El ámbito es solo la unidad de compilación.

Las cosas se ponen más interesantes cuando la palabra clave extern se considera. Cuando una variable extern está definida el compilador le asigna memoria. Cuando una variable extern es declarada, el compilador requiere que la variable sea definida en otro lugar. Si no se declaran/definen variables extern, se producirán problemas de vinculación, mientras que si no se declaran / definen variables static, se producirán problemas de compilación.

En el ámbito del archivo, la palabra clave estática es opcional (fuera de una función):

int a = 32;

Pero no en el ámbito de la función (dentro de una función):

static int a = 32;

Técnicamente, extern y static son dos clases separadas de variables en C.

extern int a; /* Declaration */
int a; /* Definition */

Registrar memoria

La última clase de memoria son variables 'register'. Como era de esperar, las variables de registro deben asignarse en el registro de una CPU, pero la decisión en realidad se deja al compilador. No puede convertir una variable de registro en una referencia utilizando address-of.

register int meaning = 42;
printf("%p\n",&meaning); /* this is wrong and will fail at compile time. */

La mayoría de los compiladores modernos son más inteligentes que usted al elegir qué variables debe ser puesto en registros:)

Referencias:

Notas sobre la asignación de memoria estática

Es algo confuso decir que la memoria estática se asigna en tiempo de compilación, especialmente si empezamos a considerar que la máquina de compilación y la máquina host podrían no ser la misma o incluso podrían no estar en la misma arquitectura.

Puede ser mejor pensar que la asignación de memoria estática es manejado por el compilador en lugar de asignado en tiempo de compilación. Por ejemplo, el compilador puede crear una sección data grande en el binario compilado y cuando el programa se carga en memoria, la dirección dentro del segmento data del programa se utilizará como la ubicación de la memoria asignada. Esto tiene la marcada desventaja de hacer que el binario compilado sea muy grande si usa mucha memoria estática. Es posible escribir un multi-gigabytes binarios generados a partir de menos de media docena de líneas de código. Otra opción es que el compilador inyecte código de inicialización que asignará memoria de alguna otra manera antes de que se ejecute el programa. Este código variará según la plataforma de destino y el sistema operativo. En la práctica, los compiladores modernos usan heurística para decidir cuál de estas opciones usar. Puede probar esto usted mismo escribiendo un pequeño programa en C que asigna una gran matriz estática de 10k, 1m, 10m, 100m, 1G o 10G elemento. Para muchos compiladores, el tamaño binario seguirá creciendo linealmente con el tamaño de la matriz, y pasado un cierto punto, se reducirá nuevamente a medida que el compilador use otra estrategia de asignación.

 88
Author: brice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-24 13:41:37

Dynamic Memory allocation - la memoria se asigna durante el tiempo de ejecución en heap. Esto se usa cuando la cantidad(tamaño) de memoria es variable y solo se conoce durante el tiempo de ejecución. La asignación dinámica se logra usando ciertas funciones como malloc(), calloc(), realloc (), free en C y "new", "delete" en C++.

Static Memory Allocation - memoria asignada en tiempo de compilación en stack u otros segmentos de datos. Esto se usa cuando la cantidad (tamaño) de memoria es estática / constante y es conocido durante el tiempo de compilación.

 3
Author: vinay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-12 13:35:25

Asignación de memoria estática: El compilador asigna el espacio de memoria requerido para una variable.By utilizando la dirección del operador, se obtiene la dirección reservada y esta dirección se puede asignar a una variable puntero.Dado que la mayoría de las variables declaradas tienen memoria estática, esta forma de asignar un valor de puntero a una variable de puntero se conoce como asignación de memoria estática. la memoria se asigna durante el tiempo de compilación.

Asignación Dinámica de memoria: utiliza funciones como malloc () o calloc () para obtener memoria dinámicamente.Si estas funciones se utilizan para obtener memoria dinámicamente y los valores devueltos por estas funciones se asignan a variables de puntero, tales asignaciones se conocen como asignación de memoria dinámica.la memoria se asienta durante el tiempo de ejecución.

 2
Author: Rajeev Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-12 13:18:29

Asignación de memoria estática. La memoria asignada estará en la pila.

int a[10];

Asignación dinámica de memoria. La memoria asignada estará en el montón.

int *a = malloc(sizeof(int) * 10);

Y este último debe ser libre d ya que no hay Recolector de Basura(GC) en C.

free(a);
 1
Author: onemach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-12 14:05:51

Diferencia entre ASIGNACIÓN DE MEMORIA ESTÁTICA & ASIGNACIÓN DINÁMICA DE MEMORIA

La memoria se asigna antes de que comience la ejecución del programa (Durante la Compilación).
La memoria se asigna durante la ejecución del programa.

No se realizan acciones de asignación o desasignación de memoria durante la Ejecución.
Los enlaces de memoria se establecen y destruyen durante la Ejecución.

Las variables permanecen permanentemente asignadas.
Asignado solo cuando la unidad del programa está activa.

Implementado usando pilas y montones.
Implementado usando segmentos de datos.

Se necesita un puntero para acceder a las variables.
No hay necesidad de punteros asignados dinámicamente.

Ejecución más rápida que Dinámica.
Ejecución más lenta que estática.

Se requiere más Espacio de memoria.
Se requiere menos espacio de memoria.

 1
Author: Ebenezer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-12 16:56:26

La asignación de memoria estática es la memoria asignada antes de la ejecución del programa pf durante el tiempo de compilación. La alocalización de memoria dinámica es la memoria alocalizada durante la ejecución del programa en tiempo de ejecución.

 0
Author: Ritu maheswari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-18 08:31:52