Je voudrais savoir quelle est la différence entre l'allocation de mémoire statique et l'allocation de mémoire dynamique?
Pourriez-vous expliquer cela avec un exemple?
Il existe trois types d'allocation: statique, automatique et dynamique.
Allocation statique signifie que la mémoire de vos variables est allouée au démarrage du programme. La taille est fixée lors de la création du programme. Il s'applique aux variables globales, aux variables de portée de fichier et aux variables qualifiées avec static
défini dans les fonctions.
Allocation automatique de mémoire se produit pour les variables (non statiques) définies à l'intérieur de fonctions, et est généralement stocké sur la pile (bien que le standard C n'impose pas l'utilisation d'une pile). Vous n'avez pas besoin de réserver de la mémoire supplémentaire pour les utiliser, mais vous avez également un contrôle limité sur la durée de vie de cette mémoire. E.g: les variables automatiques dans une fonction ne sont là que jusqu'à la fin de la fonction.
void func() {
int i; /* `i` only exists during `func` */
}
Allocation dynamique de la mémoire est un peu différent. Vous contrôlez maintenant la taille exacte et la durée de vie de ces emplacements de mémoire. Si vous ne le libérez pas, vous rencontrerez des fuites de mémoire pouvant entraîner le blocage de votre application car, à un moment donné, le système ne peut pas allouer plus de mémoire.
int* func() {
int* mem = malloc(1024);
return mem;
}
int* mem = func(); /* still accessible */
Dans l'exemple supérieur, la mémoire allouée est toujours valide et accessible, même si la fonction s'est terminée. Quand vous avez fini avec la mémoire, vous devez la libérer:
free(mem);
Ceci est une question d'entrevue standard:
La mémoire est-elle allouée au moment de l'exécution à l'aide de calloc()
, malloc()
et d'amis. On l'appelle parfois aussi mémoire 'heap', bien que cela n'ait rien à voir avec la structure de données heap ref .
int * a = malloc(sizeof(int));
La mémoire de tas est persistante jusqu'à ce que free()
soit appelé. En d'autres termes, vous contrôlez la durée de vie de la variable.
C'est ce que l'on appelle communément la «pile» de mémoire. Elle est allouée lorsque vous entrez une nouvelle étendue (généralement lorsqu'une nouvelle fonction est insérée dans la pile d'appels). Une fois que vous avez quitté la portée, les valeurs des adresses de mémoire automatiques ne sont pas définies et il s’agit d’un erreur d’accès .
int a = 43;
Notez que la portée ne signifie pas nécessairement fonction. Les étendues peuvent être imbriquées dans une fonction et la variable ne sera incluse dans la portée que dans le bloc dans lequel elle a été déclarée. Notez également que l'emplacement où cette mémoire est allouée n'est pas spécifié. (Sur un système sane, ce sera sur la pile ou sur des registres pour l'optimisation)
Est alloué à la compilation et la durée de vie d'une variable en mémoire statique est la durée de vie du programme .
En C, la mémoire statique peut être allouée à l'aide du mot clé static
. La portée est uniquement l'unité de compilation.
Les choses deviennent plus intéressantes quand on considère le mot clé extern
} _. Quand une variable extern
est define, le compilateur lui alloue de la mémoire. Quand une variable extern
est declare, le compilateur exige que la variable soit define ailleurs. L'échec de la déclaration/définition des variables extern
entraînera des problèmes de liaison, tandis que l'échec de la déclaration/définition des variables static
entraînera des problèmes de compilation.
dans l'étendue du fichier, le mot-clé static est optionnel (en dehors d'une fonction):
int a = 32;
Mais pas dans la portée de la fonction (à l'intérieur d'une fonction):
static int a = 32;
Techniquement, extern
et static
sont deux classes distinctes de variables en C.
extern int a; /* Declaration */
int a; /* Definition */
La dernière classe de mémoire sont des variables 'register'. Comme prévu, les variables de registre doivent être allouées sur le registre d'une CPU, mais la décision est en réalité laissée au compilateur. Vous ne pouvez pas transformer une variable de registre en une référence en utilisant address-of.
register int meaning = 42;
printf("%p\n",&meaning); /* this is wrong and will fail at compile time. */
La plupart des compilateurs modernes sont plus intelligents que vous pour choisir les variables à mettre dans les registres :)
Il est quelque peu déroutant de dire que la mémoire statique est allouée au moment de la compilation, en particulier si nous commençons à considérer que la machine de compilation et la machine hôte peuvent ne pas être identiques ou ne pas être sur la même architecture.
Il peut être préférable de penser que l'allocation de mémoire statique est gérée par le compilateur plutôt que allouée au moment de la compilation. Par exemple, le compilateur peut créer une grande section data
dans le fichier binaire compilé et lorsque le programme est chargé en mémoire, l'adresse située dans le segment data
du programme sera utilisée comme emplacement de la mémoire allouée. Cela a l'inconvénient marqué de rendre le binaire compilé très volumineux s'il utilise beaucoup de mémoire statique. Il est possible d'écrire un binaire de plusieurs gigaoctets généré à partir de moins d'une demi-douzaine de lignes de code. Une autre option consiste pour le compilateur à injecter un code d'initialisation qui allouera la mémoire d'une autre manière avant l'exécution du programme. Ce code varie en fonction de la plate-forme cible et du système d'exploitation. En pratique, les compilateurs modernes utilisent des méthodes heuristiques pour décider laquelle de ces options utiliser. Vous pouvez essayer cela vous-même en écrivant un petit programme en C qui alloue un grand tableau statique d'éléments de 10k, 1m, 10m, 100m, 1G ou 10G. Pour de nombreux compilateurs, la taille binaire continuera à croître de manière linéaire avec la taille du tableau et, après un certain point, elle diminuera à nouveau à mesure que le compilateur utilise une autre stratégie d'allocation.
Allocation dynamique de mémoire - La mémoire est allouée pendant l'exécution dans le segment de mémoire. Ceci est utilisé lorsque la quantité (taille) de mémoire est variable et n'est connue que pendant l'exécution. L'allocation dynamique est réalisée à l'aide de certaines fonctions telles que malloc (), calloc (), realloc (), free en C et "new", "delete" en C++.
Allocation de mémoire statique - mémoire allouée lors de la compilation dans une pile ou d'autres segments de données. Ceci est utilisé lorsque la quantité (taille) de mémoire est statique/constante et est connue pendant la compilation.
Allocation de mémoire statique: / Le compilateur alloue l'espace mémoire requis pour une variable déclarée.En utilisant l'adresse de l'opérateur, l'adresse réservée est obtenue et cette adresse peut être affectée à une variable de mémoire statique, cette manière d’attribuer une valeur de pointeur à une variable de pointeur est appelée allocation de mémoire statique. la mémoire est assignée pendant la compilation.
Allocation dynamique de mémoire: Il utilise des fonctions telles que malloc () ou calloc () pour obtenir de la mémoire dynamiquement.Si ces fonctions sont utilisées pour obtenir de la mémoire de manière dynamique et connu sous le nom d'allocation dynamique de mémoire. La mémoire est vérifiée pendant l'exécution.
Différence entre ALLOCATION DE MÉMOIRE STATIQUE & ALLOCATION DYNAMIQUE DE MÉMOIRE
La mémoire est allouée avant le début de l'exécution du programme .__ (Pendant la compilation).
La mémoire est allouée pendant l'exécution du programme.
Aucune action d'allocation de mémoire ou de désallocation n'est effectuée pendant l'exécution.
Les liaisons de mémoire sont établies et détruites pendant l'exécution.
Les variables restent allouées en permanence.
Affecté uniquement lorsque l'unité de programme est active.
Mis en œuvre en utilisant des piles et des tas.
Implémenté à l'aide de segments de données.
Un pointeur est nécessaire pour accéder aux variables.
Pas besoin de pointeurs alloués dynamiquement.
Une exécution plus rapide que dynamique.
Une exécution plus lente que statique.
Plus de mémoire Espace requis.
Moins d’espace mémoire requis.
L'allocation de mémoire statique est allouée à la mémoire avant l'exécution du programme pf pendant la compilation . L'allocation dynamique de la mémoire est allouée à la mémoire pendant l'exécution du programme au moment de l'exécution.
Allocation de mémoire statique. La mémoire allouée sera en pile.
int a[10];
Allocation dynamique de la mémoire. La mémoire allouée sera dans le tas.
int *a = malloc(sizeof(int) * 10);
et ce dernier devrait être free d puisqu'il n'y a pas de Garbage Collector (GC) dans C.
free(a);