Où sont stockées les variables en C ++?
Où sont variables en C++ stockées?
À l'intérieur de la RAM ou du processeur mémoire cache?
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Où sont variables en C++ stockées?
À l'intérieur de la RAM ou du processeur mémoire cache?
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Les Variables sont stockées:
auto
-matic fonction des variables localesnew
oumalloc
etc. (les détails de ce que cela signifie de dire "une variable est stockée dans le tas" dans les commentaires)static
C'est tout dans la RAM, bien sûr. La mise en cache est transparent pour l'utilisateur, les processus, mais il peut visibily affecter les performances.
Les compilateurs peuvent optimiser le code pour stocker des variables dans les registres. C'est très compilateur et le code-dépendante, mais bon compilateurs faire agressivement.
Pour le C++ en général, la bonne réponse est "partout où votre compilateur décide de les mettre". Vous ne devriez pas faire des hypothèses autrement, à moins que vous en quelque sorte directement de votre compilateur autrement. Certaines variables peuvent être entièrement stockées dans les registres, et certains risquent d'être totalement optimisé et remplacé par un littéral quelque part. Avec certains compilateurs sur certaines plates-formes, des constantes peut effectivement se retrouver dans la ROM.
La partie de votre question sur "le processeur cache" est un peu confus. Il y a quelques outils pour diriger la façon dont le processeur gère son cache, mais en général c'est le processeur de l'entreprise et doit être invisible pour vous. Vous pouvez penser à la cache comme votre CPU de la fenêtre dans la RAM. Assez bien tout d'accès à la mémoire passe par le cache.
À l'autre bout de l'équation, la RAM inutilisée parfois obtenir échangé sur le disque sur la plupart des Systèmes d'exploitation. Il est donc possible (mais peu probable) que, à certains moments de vos variables sont stockées sur le disque. 🙂
Variables sont généralement stockées dans la mémoire RAM. C'est sur le tas (par exemple, toutes les variables globales sont l'habitude d'y aller) ou sur la pile (toutes les variables déclarées à l'intérieur d'une méthode/fonction habitude d'y aller). La pile et le Tas sont à la fois la RAM, juste des endroits différents. Les pointeurs ont des règles différentes. Le pointeur de quelque chose (un bloc de mémoire, un objet, etc.) lui-même suit les règles ci-dessus (un pointeur déclaré à l'intérieur d'une fonction est stockée dans la pile), mais les données qu'il pointe vers (le bloc de mémoire elle-même ou l'objet que vous avez créé avec les nouveaux) sont stockées sur le tas. Vous pouvez créer des pointeurs pointant vers la pile (par exemple "int a = 10; int * b = &a;", b points de a et a est stocké sur la pile), mais l'allocation de la mémoire avec malloc ou nouveau compte vers un segment de mémoire.
Ce qui se passe dans le cache CPU est au-delà de compilateurs de contrôle, le CPU se décide lui-même ce qui cache et comment les temps de mise en cache (en fonction de facteurs comme l' "A ces données récemment été utilisée?" ou "Est-il prévu que l'utilisation de données à bientôt à nouveau?" et bien sûr la taille de la mémoire cache a une grande influence pour combien de temps Cpu seront garder les données, il y a le plus de cache, ils ont, le plus de données qu'ils peuvent mettre en cache et en plus on peut garder les données avant de libérer le cache de l'espace pour les nouvelles données).
Le compilateur peut seulement décider si les données dans une CPU registre. Habituellement, les données y est conservé s'il est d'un accès très souvent en ligne (depuis l'accès de registre est plus rapide que le cache et beaucoup plus rapide que la RAM). Certaines opérations sur certains systèmes peuvent effectivement être effectuée seulement si les données sont dans un registre toutefois, le compilateur va décider de copier les données vers la mémoire RAM immédiatement après l'exécution de l'opération ou de l'y maintenir pour effectuer de nombreuses opérations sur elle avant de l'écrire à la RAM. Il sera toujours essayer de garder le plus souvent des données accessibles dans un registre si possible et si c'est à court de registres (en fonction du nombre de registres de votre CPU a), il devra décider s'il est préférable d'écrire les données dans la RAM (et de chercher à partir de là quand on a besoin de nouveau), ou juste temporairement swap les données sur la pile et, plus tard, ensuite le récupérer à partir de là (même si la pile est de la RAM, généralement à l'aide de la pile est plus rapide puisque les microprocesseurs ont généralement le haut de la pile mise en cache de toute façon, donc, de pousser et de popping pile pourrait en fait être seulement de l'écriture à la mémoire cache et de la lecture à partir de là, les données risquent de ne jamais arriver à la mémoire à tout). Toutefois, lorsque le code de flux de sauts à partir d'une méthode/fonction à une autre, généralement tous les registres sont écrites à la mémoire, comme le compilateur ne peut guère affirmer que la fonction appelée, de méthode, de ne pas accéder à la mémoire où les données du registre venus et lorsqu'il n'écrit pas les données, la fonction peut voir une ancienne valeur est toujours présent dans la mémoire, comme la nouvelle valeur est seulement dans un registre et n'a pas été écrit encore de retour.
Les Variables en C++ sont stockés sur la pile ou le tas.
pile:
tas:
Cela dit, les deux sont des structures construites dans la mémoire RAM.
Si votre utilisation de la RAM est élevé si windows peut ce swap sur le disque.
Lorsque le calcul est fait sur les variables, la mémoire sera copié dans les registres.
C++ n'est pas au courant de votre processeur, de la mémoire cache.
Lorsque vous exécutez un programme, écrit en C++ ou tout autre langage, votre PROCESSEUR va conserver une copie de "populaire" des morceaux de RAM dans un cache. Cela est fait au niveau du matériel.
Ne pense pas que de cache du PROCESSEUR "autre" ou "plus" de mémoire...c'est juste un mécanisme pour garder quelques morceaux de RAM à proximité.
Je pense que vous mélangez deux concepts. L'un, comment le langage C++ stocker des variables en mémoire. De deux, comment l'ordinateur et du système d'exploitation de gérer la mémoire.
En C++, les variables peuvent être alloués sur la pile, qui est la mémoire qui est réservé pour l'utilisation du programme et est fixé dans la taille au début de fil ou dans la mémoire dynamique qui peut être attribué à la volée à l'aide de nouveau. Un compilateur peut également choisir de stocker les variables sur les registres du processeur si l'analyse de code le permet. Ces variables ne verrait jamais la mémoire du système.
Si une variable se termine dans la mémoire, le système d'exploitation et le processeur jeu de puces de prendre le dessus. Les deux pile en fonction des adresses et des adresses dynamiques sont virtuels. Cela signifie qu'ils peuvent ou peuvent ne pas être résident dans la mémoire du système à un moment donné. La mémoire de la variable peuvent être stockées dans la mémoire du système, paginée sur disque ou peut-être des résidents dans un cache sur ou à proximité du processeur. Donc, il est difficile de savoir qui est réellement vivant. Si un programme n'a pas été inactif pendant une heure ou deux programmes sont en concurrence pour les ressources de la mémoire, la valeur peut être sauvé hors de disque dans le fichier de page et restaurés lorsque ce sont les programmes tour à exécuter. Si la variable est locale à certains travaux, il peut être modifié dans les processeurs cache plusieurs fois avant de finalement vidé vers la mémoire du système. Le code que vous avez écrit ne saura jamais ce qui s'est passé. Tous il sait qu'il a une adresse pour fonctionner sur et de tous les autres systèmes de prendre soin de tout le reste.
Les Variables peuvent être détenues dans un certain nombre de différents endroits, parfois dans plus d'un endroit. La plupart des variables sont placées dans la mémoire vive lorsqu'un programme est chargé; parfois, des variables qui sont déclarées
const
sont plutôt placés dans la mémoire ROM. Chaque fois qu'une variable est accessible, si elle n'est pas dans le processeur mémoire cache cache miss sera le résultat, et le processeur de décrochage alors que la variable est copiée à partir de la RAM/ROM dans le cache.Si vous avez tout à mi-chemin décent optimisation du compilateur, les variables locales souvent au lieu d'être stockées dans un processeur de fichier de registre. Variables font l'aller et retour entre la mémoire RAM, la mémoire cache, et le fichier de registre comme elles sont lues et écrites, mais ils seront généralement de toujours avoir une copie en RAM/ROM, à moins que le compilateur décide ce n'est pas nécessaire.
Le langage C++ prend en charge deux types d'allocation de mémoire à travers les variables dans les programmes C++:
Allocation statique est ce qui se passe quand vous déclarez une statique ou variable globale. Chaque statique ou variable globale définit un bloc d'espace, de taille fixe. L'espace est alloué une fois, lorsque votre programme est démarré (partie de l'exec de l'opération), et n'est jamais libérée.
Affectation automatique se produit lorsque vous déclarez une variable automatique, comme un argument de fonction ou une variable locale. L'espace d'une variable automatique est alloué lors de l'instruction composée contenant la déclaration est entré, et il est libéré lorsque cette instruction composée est sorti. La taille du stockage automatique peut être une expression qui varie. En d'autres RPC implémentations, il doit être une constante.
Un tiers importante de l'allocation de la mémoire, de l'allocation dynamique, n'est pas pris en charge par le C++ variables, mais est disponible les fonctions de la Bibliothèque.
Allocation Dynamique De La Mémoire
Allocation dynamique de la mémoire est une technique dans laquelle les programmes de déterminer qu'ils sont en cours d'exécution où stocker certaines informations. Vous avez besoin d'allocation dynamique lorsque la quantité de mémoire dont vous avez besoin, ou combien de temps vous continuez à avoir besoin d'elle, dépend de facteurs qui ne sont pas connus avant l'exécution du programme.
Par exemple, vous pourriez avoir besoin d'un bloc de stocker une ligne de lire un fichier d'entrée; car il n'ya pas de limite à la durée d'une ligne, peut-être, vous devez allouer de la mémoire dynamiquement et de le faire de manière dynamique plus grand que vous lisez plus de la ligne.
Ou, vous pouvez avoir besoin d'un bloc pour chaque dossier ou de définition des données d'entrée; puisque vous ne pouvez pas savoir à l'avance combien il y aura, vous devez allouer un nouveau bloc pour chaque enregistrement ou de la définition que vous lisez.
Lorsque vous utilisez l'allocation dynamique de l'allocation d'un bloc de mémoire est une action que le programme le demande explicitement. Vous appelez une fonction ou une macro lorsque vous souhaitez allouer de l'espace, et de spécifier la taille avec un argument. Si vous souhaitez libérer de l'espace, vous le faites par l'appel d'une autre fonction ou une macro. Vous pouvez faire ces choses chaque fois que vous voulez, aussi souvent que vous le souhaitez.
L'allocation dynamique n'est pas pris en charge par le RPC variables; il n'y a pas de classe de stockage “dynamique”, et il ne peut jamais être RPC variable dont la valeur est stockée dans allouée dynamiquement l'espace. La seule façon d'obtenir de mémoire allouée dynamiquement via un appel système , et la seule façon de se référer à allouée dynamiquement l'espace est par le biais d'un pointeur. Parce que c'est moins pratique, et parce que le processus réel de l'allocation dynamique nécessite plus de temps de calcul, les programmeurs utilisent généralement l'allocation dynamique uniquement lorsque ni statiques, ni automatique de la répartition de servir.
Par exemple, si vous souhaitez allouer dynamiquement de l'espace de tenir une struct foobar, vous ne pouvez pas déclarer une variable de type struct toto dont les contenus sont alloués dynamiquement l'espace. Mais vous pouvez déclarer une variable de type pointeur vers une struct toto * et attribuez-lui l'adresse de l'espace. Ensuite, vous pouvez utiliser les opérateurs ‘*’ et ‘-> " sur ce pointeur de variable pour désigner le contenu de l'espace:
selon la façon dont ils sont déclarés, ils seront stockés dans le "tas" ou la "pile"
Le tas est un dynamique structure de données que l'application peut utiliser.
Lorsque l'application utilise les données qu'il a à être déplacé vers le CPU registres juste avant qu'ils sont consommés, mais c'est très volatile et de stockage temporaire.