2010-06-26 7 views
0

Si j'ai le code comme ceci:Où en mémoire sont les variables stockées en C++?

int e; 
int* f; 

int main() { 
    int a, b, c; 
    int* d; 
} 

Où en mémoire sont ces variables stockées? Et, quel est le problème avec la définition de variables globales (hors d'une fonction, comme dans ce cas principal)?

+4

Lisez ceci: http://www.gotw.ca/gotw/009.htm –

+0

Merci beaucoup pour le lien! – Puyover

Répondre

6

a, b, c et d existeront sur la pile. Si vous deviez créer une instance d'un int (avec malloc ou new), cela irait sur le tas - mais le pointeur appelé 'd' existerait toujours sur la pile.

e et f sont l'espace alloué dans l'espace mémoire de l'application, dans le soi-disant 'segment de données' - voir:

http://en.wikipedia.org/wiki/Data_segment

Vous avez également demandé la taille de la pile: qui est configuré par le compilateur, voir ici:

http://msdn.microsoft.com/en-us/library/tdkhxaks(VS.71).aspx

+0

Oh merci. Très utile l'info sur le segment de données! Et à propos de la taille de la pile merci, j'ai les choses plus claires maintenant :) – Puyover

+0

Avec n'importe quel compilateur d'optimisation, les gens du coin étant sur la pile est une sorte de chose incertaine. Il peut être utile sur le plan conceptuel de dire qu'ils sont tous sur la pile, mais la plupart du temps cela ne reflète pas la réalité. –

+0

D'accord, afin de faire beaucoup avec eux, ils seront transférés à des registres (http://en.wikipedia.org/wiki/Processor_register). Mais demandé "où sont les variables locales allouées" la réponse est "la pile" :) –

3

Pourquoi pensez-vous que cela a de l'importance? Notez qu'en C++ moderne, avoir des variables de pointeurs locales est extrêmement rare.

Sur un système typique, a, b, c et d vont vivre sur la pile. Mais c'est un détail de mise en œuvre, la norme linguistique ne dit rien de précis à ce sujet.

+0

Y at-il un moyen, je peux savoir quelle est la taille de la pile dans un PC standard? – Puyover

+0

La taille de la pile est spécifique au filetage. –

+0

... et de déterminer la taille de la pile pour un thread donné est spécifique au système d'exploitation. Dans Windows, vous pouvez obtenir ces informations en récupérant des blocs d'informations de thread (32 bits) ou des blocs d'environnement de thread (64 bits). – stinky472

9

Il n'y a actuellement aucune garantie sur le placement des variables dans la mémoire, seul comportement.

Mais la plupart (peut-être tous) des systèmes pratiques, e et f seront dans la section de données globales, tandis que a, b, c, d sont dans un mélange de registres et sur la pile d'appel. Les deux f et d peuvent pointer vers n'importe où dans la mémoire (bien, avec un MMU ce n'est pas exactement vrai, ils peuvent pointer n'importe où dans le sous-ensemble de mémoire qui est mappé dans le processus).

+0

Merci. Puis-je définir autant de variables globales que je veux sans avoir de problèmes de performance/espace? – Puyover

+4

@Puy: Vous aurez certainement des problèmes de conception avec de nombreuses variables globales. – fredoverflow

+0

Vous pouvez avoir un grand nombre de variables globales, mais toutes les variables allouées statiquement doivent être initialisées ce qui ralentira le démarrage du programme. Cela ne suffira probablement pas à remarquer. Comme le dit Fred, cependant, en utilisant beaucoup de variables globales rendra votre programme difficile à maintenir, donc ce n'est pas recommandé. Mieux serait des variables de portée de fichier sans lien externe, cela peut être fait en utilisant l'espace de noms sans nom en C++ ou le mot-clé 'static' en C (non recommandé pour C++), et ne conduira pas au code spaghetti aussi facilement que les variables globales. –

1

Le point principal est la portée des variables, qui définit leur durée de vie. Les variables outsie de principal seront disponibles pour la durée de votre programme. Les variables à l'intérieur de main seront disponibles pour la durée de la fonction main().

Dans la pratique, les variables scope fonction-sont généralement attribués sur la pile, alors que les variables globales sont allouées sur le tas, mais cela est un détail de mise en œuvre.

Le principal problème avec les variables globales contrôle l'accès, et ils peuvent être difficiles à travailler dans un programme multi-thread.

EDIT: Comme @FredOverflow souligne ci-dessous, les variables globales sont généralement répartis dans la zone de données qui est mis en place lorsque l'image exécutable est chargé.

+0

Je suis assez sûr que les variables globales ne sont pas allouées à partir du tas, mais à partir du segment de données ou quelque chose .. – fredoverflow

+0

@Fred - vous avez raison. ! – mdma

3

En général, a, b, c, d * sera défini sur la pile de programme, bien que la norme C++ ISO ne précise pas où les variables doivent être définies.

Pour votre deuxième question, le problème avec les variables globales est qu'ils ne sont pas protégés.Pour un script/une application simple, se fier aux globals peut convenir, mais dans les bibliothèques, et un code plus complexe, cela crée un problème potentiel: n'importe quel code peut changer les valeurs des variables avec une portée globale à tout moment. un état indésirable. De plus, comme les variables sont dans la portée globale, elles sont ouvertes aux collisions de noms potentielles si vous utilisez un autre code qui définit des variables globales avec le même nom.

Questions connexes