Où sont stockées les variables locales, globales, statiques, automatiques, de registre, externes, constantes et volatiles?

Où sont stockées les variables locales, globales, statiques, automatiques, de registre, externes, constantes et volatiles?

  • Les variables locales peuvent être stockées sur la stack ou dans un segment de données, selon qu’elles sont auto ou statiques. (si ni auto ni statique n’est explicitement spécifié, auto est supposé)

  • les variables globales sont stockées dans un segment de données (à moins que le compilateur ne puisse les optimiser, voir const) et ont une visibilité à partir du sharepoint déclaration jusqu’à la fin de l’unité de compilation.

  • Les variables statiques sont stockées dans un segment de données (là encore, à moins que le compilateur ne puisse les optimiser) et ont une visibilité à partir du sharepoint déclaration jusqu’à la fin de la scope englobante. Les variables globales qui ne sont pas statiques sont également visibles dans les autres unités de compilation (voir extern).

  • Les variables auto sont toujours locales et sont stockées dans la stack.

  • le modificateur de registre indique au compilateur de faire de son mieux pour conserver la variable dans un registre, dans la mesure du possible. Sinon, il est stocké sur la stack.

  • Les variables externes sont stockées dans le segment de données. Le modificateur extern indique au compilateur qu’une unité de compilation différente est en train de déclarer la variable. Ne créez donc pas une autre instance de celle-ci, sinon il y aura une collision de noms au moment de la liaison.

  • Les variables const peuvent être stockées sur la stack ou sur un segment de données en lecture seule, selon qu’elles sont auto ou statiques. Cependant, si le compilateur peut déterminer qu’ils ne peuvent pas être référencés à partir d’une unité de compilation différente, ou que votre code n’utilise pas l’adresse de la variable const, il est libre de l’optimiser (chaque référence peut être remplacée par la valeur constante). . Dans ce cas, il n’est stocké nulle part.

  • le modificateur volatile indique au compilateur que la valeur d’une variable peut changer à tout moment d’influences externes (généralement du matériel); il ne doit donc pas chercher à optimiser les rechargements de mémoire dans un registre lorsque cette variable est référencée. Cela implique un stockage statique.

BTW tout cela s’applique à C & C ++ ainsi qu’à Objective-C.

A quel niveau d’abstraction cherchez-vous une réponse?

Au niveau physique, ils sont probablement tous stockés dans des capacités de grid et des domaines magnétiques. (Peut-être même des photons si votre disque d’échange est connecté au wifi ou à la fibre optique.)

Au niveau du matériel, des copies de l’une quelconque de ces variables peuvent exister à différents endroits du registre, du cache de données (éventuellement à plusieurs niveaux), de la mémoire principale et / ou de la hiérarchie de stockage, le tout complètement transféré sur disque ou sur stockage NV (en fonction de l’existence, de la mise en œuvre et de l’état actuel de tout sous-système de mémoire virtuelle paginée à la demande), éventuellement tout ce qui est dans les registres si la taille et la durée de vie de vos applications sont suffisamment petites.

Compte tenu des implémentations les plus connues du compilateur et de l’exécution, la mémoire (virtuelle peut-être) est découpée en éléments appelés stacks et tas. Compte tenu de la définition du langage formel, cet découpage peut être nécessaire ou non.

Au niveau de l’optimisation du compilateur, bon nombre de ces variables ont peut-être été optimisées. Ils ne sont stockés nulle part sauf en tant qu’abstraction.

Les variables locales et auto sont stockées dans la stack. Les variables globales et static sont stockées dans une page DATA. register variables de register sont stockées dans un registre sur la CPU si possible, sinon dans la stack. extern , const et volatile ne spécifient pas où la variable est stockée; la variable est stockée à la place des autres spécificateurs de stockage.

Les variables locales sont généralement stockées dans la stack et les variables globales dans le segment “texte” d’un programme (dans le cas de constantes de chaîne) ou sur le tas, si elles sont allouées de manière dynamic. Les variables automatiques sont généralement utilisées dans les fonctions / méthodes et sont généralement transmises à la stack (parfois aussi dans les registres, en fonction de l’architecture). Les variables de registre sont autrefois stockées dans des registres, mais la plupart des compilateurs ignorent le mot-clé register et les placent à leur guise, dans la stack ou dans un registre. Les membres externes, const et volatiles sont des modificateurs et n’ont donc pas de lieu définitif où ils sont stockés.

Donc, la réponse courte est, comme d’habitude, “ça dépend”.

LOCAL- Variables locales ayant la scope dans la fonction. Il peut s’agir de deux types: auto ou statique. Si elle est déclarée simplement int var.Comstackr est traitée comme une classe de stockage automatique. Les variables auto sont stockées dans Stack. Les variables statiques sont stockées dans le segment de données.

Les variables de registre sont stockées dans la CPU.Si aucun registre n’est disponible pour stocker des variables, le compilateur traitera alors comme une variable automatique.

Les variables globales sont stockées dans la zone Segment de données.

Les variables const sont stockées dans la zone de lecture seule. C’est la zone de segment de code de la mémoire.