Quand j'écris un programme en lui disant int c=5
, il met la valeur 5 dans un peu de sa mémoire, mais comment se souvient-il de laquelle? La seule façon dont je pourrais penser serait d’avoir un peu plus de mémoire pour le dire, mais il faudrait ensuite se rappeler où il a gardé cela aussi, alors comment se souvient-il où tout est?
Réponses
Trop de publicités?Il y a beaucoup de bonnes réponses ici, mais ils ont tous l'air de manquer un point important qui, je pense, était le principal objectif de l'OP question, donc, ici, va. Je parle des langages compilés comme le C++, interprétés sont beaucoup plus complexes.
Lors de la compilation de votre programme, le compilateur examine votre code pour trouver toutes les variables. Certaines variables sont va être global (ou statique), et certains vont être local. Pour les variables statiques, il les attribue fixe les adresses mémoire. Ces adresses sont susceptibles d'être séquentielle, et ils commencent à une valeur précise. En raison de la segmentation de la mémoire sur la plupart des architectures (et le virtuel, les mécanismes de la mémoire), chaque application peut (potentiellement) à utiliser les mêmes adresses de mémoire. Ainsi, si nous supposons que l'espace de la mémoire de programmes sont autorisés à utiliser commence à 0 pour notre exemple, tous les programmes de la compilation va mettre la première variable globale à la position 0. Si cette variable est de 4 octets, le prochain serait à la position 4, etc. Elles n'entrent pas en conflit avec d'autres programmes en cours d'exécution sur votre système, car ils sont en fait être mappé à un arbitraire séquentielle de la section de la mémoire au moment de l'exécution. C'est pourquoi il peut attribuer une adresse fixe au moment de la compilation, sans se soucier de frapper d'autres programmes.
Pour les variables locales, au lieu d'être affecté à une adresse fixe, ils sont affectés à une adresse fixe par rapport au pointeur de pile (qui est généralement un registre). Quand on appelle une fonction qui alloue des variables sur la pile, le pointeur de pile est simplement déplacé par le nombre d'octets, ce qui crée un décalage dans le octets sur la pile. Toutes les variables locales sont affectés fixe de compensations pour le pointeur de pile que de les mettre dans le fossé. Chaque fois qu'une variable locale est utilisée, la véritable adresse de mémoire est calculé en ajoutant le pointeur de pile et le décalage (en négligeant la mise en cache les valeurs dans les registres). Lorsque la fonction retourne le pointeur de pile est réinitialisé à la façon dont elle était avant la fonction a été appelée ainsi l'ensemble de la pile châssis, y compris les variables locales est libre d'être remplacé par le prochain appel de la fonction.
lire Variable (programmation) - allocation de Mémoire:
http://en.wikipedia.org/wiki/Variable%5F%28programming%29#Memory%5Fallocation
voici le texte du lien (si vous ne voulez pas le fait d'y aller, mais il vous manque tous les liens dans le texte):
Les spécificités de la part variable de l'allocation de et la représentation de leurs valeurs varier largement, à la fois parmi la programmation les langues et entre les implémentations de une langue donnée. De nombreuses la langue les implémentations allouer de l'espace pour les variables locales, dont l'étendue dure pour un seul appel de fonction sur l'appel pile, et dont la mémoire est automatiquement récupérée lors de la la fonction retourne. (Plus généralement, dans liaison de nom, le nom d'une variable est lié à l'adresse de certains bloc particulier (une séquence contiguë) d'octets dans la mémoire, et les opérations sur la variable de manipuler le bloc. Le référencement est plus commun pour les les variables dont les valeurs ont de grandes ou inconnu tailles lorsque le code est compilé. Ces variables de référence de la l'emplacement de la valeur à la place de la le stockage de la valeur elle-même, qui est allouées à partir d'un pool de mémoire appelée le tas.
Lié variables ont des valeurs. Une valeur, cependant, est une abstraction, une idée; dans la mise en œuvre, une valeur est représenté par quelques données de l'objet, qui est stocké quelque part dans l'ordinateur de la mémoire. Le programme, ou le moteur d'exécution de l'environnement, doit réserver de la mémoire pour chaque objet de données et, vu que la mémoire est finis, en sorte que cette mémoire est donné pour la réutilisation lorsque l'objet est n'est plus nécessaire de représenter certaines valeur de la variable.
Les objets alloués dans le tas doit être récupérée, en particulier lorsque le les objets ne sont plus nécessaires. Dans un garbage collector de la langue (comme C#, Java, Lisp), le moteur d'exécution environnement recycle automatiquement les objets lors de l'existant variables peuvent pas plus s'y référer. Dans non garbage collector de langages, tels comme le C, le programme (et le programmeur) doit explicitement allouer de la mémoire, et puis plus tard, pour reconquérir son de la mémoire. À défaut de le faire conduit à les fuites de mémoire, dans lequel le segment de mémoire est appauvri que le programme s'exécute, risquer échec éventuel de les épuiser la mémoire disponible.
Lorsqu'une variable se réfère à des données structure créée dynamiquement, certains de ses composants peuvent être que de manière indirecte accessible par la variable. Dans de tels les circonstances, les ramasseurs d'ordures (ou analogue caractéristiques du programme dans les langues qui manque à ordures les collectionneurs) doit traiter une affaire où seulement une partie de la mémoire accessible à partir de la variable être récupérée
Il y a un multi-étape de la danse qui se transforme c = 5
dans la machine des instructions pour mettre à jour un emplacement dans la mémoire.
Le compilateur génère un code en deux parties. Il y a l'instruction de la partie (chargement d'un registre à l'adresse de C; charger un registre avec le littéral 5; magasin). Et il y a une répartition de données de la partie (congé de 4 octets de chambre à l'offset 0 pour une variable connue comme "C").
Un "liant " loader" a mettre ce genre de choses en mémoire, de manière que l'OS sera en mesure de l'exécuter. Le chargeur de demande de la mémoire et le système d'exploitation alloue des blocs de mémoire virtuelle. Le système d'exploitation également les cartes de la mémoire virtuelle de la mémoire physique par un autre ensemble de mécanismes de gestion.
Le chargeur met la page de données en un seul endroit et de l'instruction de la partie dans un autre endroit. Notez que les instructions d'utilisation relative des adresses (un décalage de 0 dans la page de données). Le chargeur fournit l'emplacement réel de la page de données de sorte que les instructions peuvent résoudre l'adresse réelle.
Lorsque la quantité de "stocker" l'instruction est exécutée, le système d'exploitation pour voir si les données référencées page est en fait dans la mémoire physique. Il peut être dans le fichier d'échange et d'avoir à se charger en mémoire physique. L'adresse virtuelle utilisée est traduite en une adresse physique de la mémoire des lieux.
Il est intégré dans le programme.
En gros, quand un programme est compilé en langage machine, il devient une série d'instructions. Des instructions ont des adresses de mémoire intégrée, et c'est la "fin de chaîne", pour ainsi dire. Le compilateur décide de l'endroit où chaque variable sera et brûle cette information dans le fichier exécutable. (Rappelez-vous le compilateur est un programme de l'écrit; il suffit de se concentrer sur la façon dont le programme fonctionne pour le moment).
Par exemple,
ADD [1A56], 15
pourrait ajouter 15 à la valeur à l'emplacement 1A56. (Cette instruction serait encodée à l'aide du code que le processeur comprend, mais je ne vais pas l'expliquer.)
Maintenant, d'autres instructions vous permettent d'utiliser une "variable" de la mémoire d'adresse: adresse mémoire qui était lui-même chargé à partir d'un certain endroit. C'est la base de pointeurs en C. Vous avez certainement ne pouvez pas avoir une chaîne infinie de ces, sinon, vous devez exécuter de mémoire.
J'espère que efface les choses.