Bonjour et bienvenue à nouveau. Dans cette conférence, je veux parler de l'allocation de mémoire dynamique.
Ceci est directement lié aux pointeurs, vous ne pouvez l'utiliser que
sur les pointeurs. Alors, commençons.
Ainsi, chaque fois que vous définissez une
variable dans c, le compilateur alloue automatiquement la quantité de stockage correcte pour vous en fonction du type de données.
Nous avons vu cela partout. Lorsque nous créons des entiers, des flottants, des doubles, nous n'avons pas à allouer de mémoire.
Le compilateur le fait pour vous. Il alloue en fait de la mémoire.
Il en va de même pour les pointeurs d'ailleurs. Lorsque vous créez un pointeur, de la
mémoire vous est allouée, afin qu'elle stocke un type de pointeur, une adresse.
Cela ne veut pas dire que de la mémoire est allouée pour cette adresse.
Jusqu'à ce point, chaque fois que nous affectons des données à un -
à un pointeur, nous avons toujours assigné une variable existante.
Donc, si nous voulions attribuer des
données à un pointeur, nous avons utilisé l'adresse esperluette de l'opérateur sur une
variable qui avait déjà de la mémoire allouée à cette variable.
Mais que faire si vous vouliez créer un pointeur et que vous ne vouliez pas lui attribuer
l'adresse d'opérateur, vous vouliez allouer dynamiquement de la mémoire. C'est le sujet de toute cette conférence.
Il est donc souvent souhaitable de pouvoir allouer dynamiquement du stockage
pendant l'exécution d'un programme. Allouez de la mémoire selon vos besoins.
Si vous disposez d'un programme conçu pour lire un ensemble de données à partir
d'un fichier dans un tableau en mémoire, vous avez trois choix.
Vous pouvez définir le tableau pour qu'il contienne le nombre maximum d'éléments possibles qui se compilent au moment de
la compilation, c'est une taille fixe.
Si vous définissez le tableau qui contient 50 éléments,
il ne contiendra que 50 éléments. Le compilateur détermine que c'est 50,
il va allouer autant de mémoire lorsqu'il s'exécute.
Vous pouvez utiliser un tableau de longueur variable à la dimension de la taille du runtime du tableau.
Nous avons parlé un peu de ces tableaux de longueur variable,
ils ne sont pas pris en charge avant C11. Ils suppriment en fait C11, ils ajoutent C99.
C'est ici que vous pouvez insérer des variables.
Mais ceux-ci sont toujours en quelque sorte de taille fixe, car tout
cela signifie des tableaux liés à des variables, tout ce que cela signifie, c'est que vous pouvez passer des variables pour les tailles.
Mais ils sont toujours statiques.
Ou le meilleur choix est que vous pouvez allouer le tableau dynamiquement selon vos besoins.
Et il y a différentes fonctions c que vous pouvez appeler pour ce faire.
Il sera donc très utile de pouvoir allouer dynamiquement de la mémoire.
Donc, avec la première approche que nous avons utilisée jusqu'à présent, qu'il s'agisse d'un
tableau ou d'un type de données, c'est une taille fixe.
Vous devez définir votre tableau pour qu'il contienne le nombre maximum d'éléments
qui seront directement dans un tableau.
Vous feriez donc quelque chose comme ça, int dataArray [1000].
Cela signifie cependant que le fichier de données ne peut pas contenir plus de mille éléments.
Si c'est le cas, votre programme va s'arrêter.
Vous devez donc simplement espérer que le fichier que vous lisez ne contient pas beaucoup de données.
Votre programme ne fonctionnera pas avec de grands ensembles de fichiers ou des fichiers volumineux.
Et si vous voulez travailler avec des fichiers volumineux, vous devez revenir en arrière et agrandir le tableau.
Vous devez changer la taille, mais
ensuite vous devez le recompiler sur tout ça, c'est le temps de la compilation.
Quelle que soit la valeur que vous sélectionnez, vous avez toujours la possibilité
de rencontrer à nouveau le même problème à l'avenir car il s'agit d'une taille fixe.
Cette taille est déterminée lorsque vous compilez le code,
elle ne s'ajuste pas lorsque vous exécutez le programme.
Cela ne change pas dynamiquement.
Grâce aux fonctions d'allocation de mémoire dynamique, vous pouvez obtenir du stockage selon vos besoins.
Cette approche vous permet d'allouer de la mémoire pendant l'exécution du programme.
Pensez donc aux avantages de cela. Tout d'abord, vous ne créez
pas une tonne de mémoire que vous n'utiliserez
peut-être pas, vous n'en créerez que ce dont vous avez besoin.
Et si vous avez besoin de plus, vous pouvez en affecter davantage.
Vous n'avez pas besoin de revenir en arrière, de recompiler et de modifier la taille.
L'allocation de mémoire dynamique est donc la voie à suivre.
Cela dépend du concept de pointeur et
cela incite fortement à utiliser des pointeurs dans votre code.
Nous avons donc parlé des avantages des pointeurs et
vous vous êtes peut-être bien dit, d'accord, c'est un concept cool, mais pourquoi devons-nous
les utiliser, c'est l'une des
grandes raisons, afin que vous puissiez allouer de la mémoire de manière dynamique.
Et encore une fois, qu'est-ce que c'est - C consiste à être un langage efficace et à
ne pas utiliser une tonne de mémoire.
Donc c fonctionne sur des systèmes embarqués, de la programmation en temps réel
et c'est l'une des raisons car vous pouvez limiter la quantité de mémoire que
vous utilisez en fonction du besoin.
L'allocation de mémoire dynamique permet donc d'allouer dynamiquement la mémoire pour stocker les données
lorsque le programme s'exécute.
L'allocation dynamique de mémoire n'est possible que parce
que vous disposez de pointeurs.
Étant donné que vous disposez d'une adresse et
que vous pouvez modifier la valeur vers laquelle pointe le pointeur, vous pouvez réajuster la mémoire.
La majorité des programmes de production utiliseront l'allocation de mémoire dynamique.
Si vous écrivez du code en c, vous allez l'utiliser.
Même si vous êtes débutant, vous allez utiliser
l'allocation de mémoire dynamique. La plupart des programmes utiles utiliseront ce concept.
L'allocation dynamique de données vous permet de créer des pointeurs au moment de l'exécution qui sont juste
assez grands pour contenir la quantité de données dont vous avez besoin pour la tâche, de
sorte que vous ne gaspillez pas de mémoire. Vital.
Nous devons également parler du tas par rapport à la pile.
Il existe deux façons de stocker de la mémoire dans un programme, deux structures
de données différentes, vous pouvez stocker des données sur la pile ou vous pouvez stocker des données
sur le tas.
L'allocation de mémoire dynamique réserve tout sur le tas.
Nous n'allons pas entrer dans les détails de leur organisation, mais essentiellement.
Lorsque vous stockez des données sur le tas, cela permet
plus de changements.
Vous pouvez modifier arbitrairement la taille des objets de données et cela reste beaucoup
plus longtemps lorsque vous allouez de la mémoire dans un tas,
cela colle à l'intégralité de votre programme.
Lorsque vous utilisez une pile, c'est plus limitatif.
La pile est utilisée pour tout, des arguments de fonction aux variables locales.
C'est là que tout cela est stocké.
Et c'est pourquoi nous avons parlé de la pile d'appels.
Il a examiné les méthodes
et les fonctions. J'utilise des méthodes de temps en temps, mais les méthodes sont vraiment un terme
orienté objet, donc les fonctions.
Tout ce qui concerne les fonctions est créé sur la pile.
Donc, ce que cela signifie, c'est que lorsque vous exécutez
une fonction, elle est placée sur la pile. Les variables locales sont placées sur la pile.
Lorsque vous quittez la fonction, tout est supprimé.
Ainsi, la mémoire située sur la pile ne reste pas très longtemps.
C'est l'une des raisons pour lesquelles vous allouez dynamiquement de la
mémoire sur le tas
parce que vous contrôlez quand vous l'utilisez et lorsque vous ne l'utilisez pas, vous l'allouez et vous la supprimez.
Des trucs sur la pile, vous ne contrôlez pas. Il est
automatiquement supprimé, automatiquement attribué.
Donc les variables locales, les variables à l'intérieur des fonctions comme la main, celles-ci
sont créées sur la pile et ainsi de suite.
La mémoire sur le tas est différente, elle est contrôlée par vous, le programmeur.
Lorsque vous allouez de la mémoire sur le tas, c'est à vous de garder une trace du moment où la
mémoire que vous avez allouée n'est plus nécessaire, vous devez donc supprimer la mémoire.
Vous devez libérer
l'espace lorsque vous ne l'utilisez plus. Et c'est important parce
que la mémoire est une ressource très, très rare.
Aujourd'hui, nous avons beaucoup de mémoire pour faire fonctionner un ordinateur, 12 concerts, 16
concerts quoi que ce soit. Mais pour les
programmes intégrés s'exécutant sur des appareils, vous n'avez
pas nécessairement autant de mémoire. Vous voulez donc contrôler la quantité de mémoire
utilisée et vous voulez également libérer la mémoire lorsque vous avez fini de l'utiliser
afin que d'autres applications puissent l'utiliser.
Encore une fois, plus important dans les systèmes de type embarqué de bas niveau.
Mais c'est une liberté que de nombreuses langues n'ont pas. Cette capacité à contrôler
la mémoire de votre gestionnaire par le programmeur, et cela peut
rendre le programme beaucoup plus efficace et beaucoup plus rapide.
Donc, dans la prochaine conférence, nous allons parler de la façon dont vous
pouvez réellement faire cela, des fonctions que vous pouvez invoquer. De toute évidence, il existe différentes fonctions que vous pouvez
appeler pour allouer de la mémoire dans la mémoire libre. Merci.