Un segment de Mémoire dans la Programmation en C
Quel est exactement un segment de mémoire?
Chaque fois qu'un appel à malloc est fait, la mémoire est affectée de quelque chose appelé comme tas. Où est exactement le tas. Je sais qu'un programme dans la mémoire principale est divisée en instruction segment dans lequel les instructions de programme sont présente, segment de Données où les données résident et le segment de pile où les variables locales et la fonction correspondante paramètres sont stockés. Maintenant, ce que tas?
OriginalL'auteur Rahul | 2012-04-17
Vous devez vous connecter pour publier un commentaire.
Le segment est une partie de votre espace d'adressage du processus. Le tas peut être augmenté ou diminué; vous manipuler en appelant
brk(2)
ousbrk(2)
. C'est en fait ce quemalloc(3)
n'.L'allocation dans le tas est plus pratique que d'allouer de la mémoire sur la pile, car elle persiste après l'appel de la routine retourne; ainsi, vous pouvez appeler une routine, dire
funcA()
, d'allouer un tas de mémoire et de le remplir avec quelque chose; que la mémoire sera toujours valide aprèsfuncA()
retourne. SifuncA()
alloue un local array (sur la pile) puis quandfuncA()
retourne, la pile de tableau est disparu.Un inconvénient de l'utilisation de la tas, c'est que si vous oubliez de retirer la pile de la mémoire allouée, vous pouvez épuiser. L'échec de la libération de segment de mémoire allouée (par exemple, à défaut de
free()
mémoire obtenu à partir demalloc()
) est parfois appelé une fuite de mémoire.Une autre caractéristique intéressante du tas, contre seulement attribution d'un local array/struct/quoi que ce soit sur la pile, est que vous obtenez une valeur de retour indique si votre allocation a réussi; si vous essayez d'affecter un local de tableau sur la pile et de vous lancer, vous n'avez pas de code d'erreur; en général, votre fil sera tout simplement annulée.
free
lorsqu'il n'est pas nécessaire est ce n'est pas plus pratique, contrairement à l'assertion.En outre, même lorsque vous ne l'utilisez de la mémoire qui exige toute une vie au-delà de la mise en fonction immédiate, vous avez deux options: 1/ de préférence (et ce devrait être votre objectif, la plupart du temps), vous devez accepter un argument pointant vers un objet, et que l'objet peut avoir aucun durée de stockage; l'appelant décide
malloc
est nécessaire (c'est de cette façonstrcat
,sprintf
, etc fonctionner) et 2/ il y a deux autres durées de stockage que vous n'avez pas mentionné (statique et de thread spécifique), et il n'est pas spécifié qu'ils sont attachés à un segment ou pile (ou registres, fwiw)...Il y a même souvent une troisième option, qui est up-stream, où vous retirez la dépendance à l'égard de variadic tableaux et de se concentrer sur le traitement fixe de données octet par octet (sans en conserver une copie) que vous recevez à partir de la source. En fait, on pourrait presque se référer à la régulière du système de fichiers comme si c'est une autre forme de durée de stockage, à l'exception que la norme ne définit pas les fichiers de manière très stricte.
OriginalL'auteur collin
En principe, après la mémoire est consommée par les besoins des programmes, ce qui est à gauche est le tas. En C qui sera la mémoire disponible pour l'ordinateur, pour les machines virtuelles, il sera de moins.
Mais, c'est la mémoire qui peut être utilisé au moment de l'exécution que votre programme a besoin de la mémoire dynamiquement.
Vous pouvez regarder ce pour plus d'info:
http://computer.howstuffworks.com/c28.htm
Aussi, c'est un exemple d'une très mauvaise ressources pour l'apprentissage C. Si vous avez besoin d'un manuel pour les consulter, c'est POSIX
malloc
manuel, qui vous noterez ne fait aucune référence au terme de segment, comme les personnes qui ont écrit votre segment comprendre (tout comme vous devriez le savoir) qu'il n'est pas nécessairement un segment, c'est un livre de maintien de l'espace.la mémoire n'est pas utilisée par l'application est ce que j'appelle le tas. Ainsi, vous aurez toutes les allocations qui fait partie du démarrage d'une application, et la mémoire qui est disponible pour la fonction malloc est le tas.
Selon le langage C, la durée de stockage mis à disposition par
malloc
est appelé de stockage alloué durée; il n'y a aucune mention d'un segment en C. Sur x86 (en raison de l'assemblage), vous pouvez peut-être (généralement) à corriger... mais c'est l'assemblée, pas de C; il n'y a pas besoin d' segment être utilisée; il pourrait tout aussi facilement être un pile ou graphique. En fait, je pense qu'une mise en œuvre optimale peut se diriger vers un graphique de des tas alloués par fil qui a des arêtes correspondant à la synchronisation.Ce site de bonne réputation les listes de référence, dans la section intitulée "des Trucs qui devraient être évitées.", pour ce que ça vaut. Vous devriez être en citant à partir de standard. Bonne chance pour trouver une citation pour le tas!
OriginalL'auteur James Black
Le tas est la démarche diamétralement opposée à la pile. Le tas est un grand pool de mémoire qui peut être utilisé de façon dynamique, il est également connu comme la “boutique”. C'est la mémoire qui n'est pas géré automatiquement – vous devez explicitement attribuer (à l'aide de fonctions telles que la fonction malloc), et de libérer des (ex) de la mémoire. L'échec pour libérer de la mémoire lorsque vous avez terminé avec lui, la conséquence de ce qui est connu comme une fuite de mémoire – la mémoire qui est toujours “utilisé”, et ne sont pas disponibles à d'autres processus. Contrairement à la pile, il n'y a généralement pas de restrictions sur la taille du segment de mémoire (ou les variables qu'il crée), autres que la taille physique de la mémoire dans la machine. Les Variables créé sur le tas sont accessibles de n'importe où dans le programme.
Oh, et un segment de mémoire vous oblige à utiliser des pointeurs.
Un résumé des tas:
un peu débordante
de crédit à craftofcoding
malloc
, la possibilité pour le programmeur de modifier une telle structure sous-jacente n'est pas quelque peu débordante; si vous aller trop loin, vous vous aventurez dans comportement indéfini, qui est l'endroit où vous avez enfreint les règles de la C.Enfreindre les règles en C peut-être que vous avez franchi une frontière. En fait, c'est le cas de dépassements de la mémoire tampon, par exemple. Parfois, vous obtenez un débordement qui fonctionne... d'autres fois, vous n'avez pas. Les règles de rupture n'a pas bien défini les conséquences et les limites de la manipulation de la structure sous-jacente sans invoquer l'UB sont quelque peu liés: Vous pouvez ajouter des entrées en appelant
malloc
, varier les entrées à l'aide derealloc
et supprimer des entrées à l'aide defree
.Enfreindre les règles en C peut-être que vous avez franchi une frontière. En fait, c'est le cas de dépassements de la mémoire tampon, par exemple. Parfois, vous obtenez un débordement qui fonctionne... d'autres fois, vous n'avez pas. Les règles de rupture n'a pas bien défini les conséquences et les limites de la manipulation de la structure sous-jacente, sont quelque peu liés: Vous pouvez ajouter des entrées en appelant
malloc
, varier les entrées à l'aide derealloc
et supprimer des entrées à l'aide defree
.OriginalL'auteur yehuda corsia
De la lecture à travers cela, c'est en fait au-delà de la sphère de C. C ne spécifie pas qu'il y a un tas derrière
malloc
; il pourrait tout aussi facilement être appelé un liste liée; vous êtes juste de l'appeler un tas par la convention.Ce que la norme garanties
malloc
renvoie un pointeur vers un objet qui a dynamique durée de stockage, et votre tas est juste un type de structure de données qui facilite la mise à disposition d'une telle durée de stockage. C'est le choix commun. Néanmoins, la très développeurs qui a écrit votre tas ont reconnu qu'il pourrait ne pas être un tas, et vous verrez donc pas de référence du terme tas dans POSIXmalloc
manuel par exemple.D'autres choses qui sont au-delà des royaumes de la norme C inclure des détails de la code machine binaire qui n'est plus de code source C de compilation suivantes. La mise en page des détails, bien que typique, sont tous de mise en œuvre spécifiques, par opposition à C-spécifique.
La tas, ou n'importe quel livre de maintien de structure de données est utilisée pour comptabiliser les attributions, est généré lors de l'exécution; que
malloc
est appelé, les nouvelles entrées sont (probablement), ajouté à cela et quefree
est appelé, les nouvelles entrées sont (encore une fois, sans doute) supprimé.Comme un résultat, il n'y a généralement pas besoin d'une section dans le code machine binaire pour les objets alloués à l'aide de
malloc
, cependant, il existe des cas où les applications sont livrées autonome cuit dans des microprocesseurs, et dans certains de ces cas, vous trouverez peut-être que flash ou une autre mémoire non volatile peut être réservé à cet usage.Vrai, que. Venez pour penser à elle, il est utilisé dans les cartes à puce Java. Mon mauvais! Ta 🙂
OriginalL'auteur autistic