IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Logique de l'adressage des variables ?


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 77
    Par défaut Logique de l'adressage des variables ?
    Bonjour, je suis en train de préparer un petit exercice sur les pointeurs, et en faisant des tests sous visual c++, je viens de me rendre compte que je ne comprends pas comment le compilateur répartit les variables dans la mémoire de l'ordinateur.

    En effet, voici une partie de mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    float a=0.001;
    float b=0.003;
    float c, *pa, *pb;
     
    cout << "Adresses : " << endl;
    cout << "&a = " << &a << endl;
    cout << "&b = " << &b << endl;
    cout << "&c = " << &c << endl;
    cout << "&pa = " << &pa << endl;
    cout << "&pb = " << &pb << endl;
    Le résultat me surprend :

    &a = 0012FF64
    &b = 0012FF68
    &c = 0012FF6C
    &pa = 0012FF5C
    &pb = 0012FF60

    D'une part, je ne comprend pas pourquoi dans la mémoire pa et pb sont placés avant a, b et c, alors qu'ils ont été déclarés après si on suit les instructions du programme.

    Par ailleurs, j'ai essayé d'échanger les déclarations de a et b, en mettant float b avant float a, et à ma grande surprise l'affichage est le même : l'adresse de b est celle de a + 4 octets...

    L'adresse des variables est-il determiné en fonction de leurs noms ? Au sujet de l'échange a - b, suis victime d'une sorte de cache de Visual Studio (qui ne reconsidère pas la déclaration des variables d'une compilation à une autre... ?)

    Enfin, est-ce le même fonctionnement en C ?

    Merci de bien vouloir m'éclairer mes chers amis.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Le compilateur fait comme bon lui semble, et ceci en C comme en C++.

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par jomeo
    Bonjour, je suis en train de préparer un petit exercice sur les pointeurs, et en faisant des tests sous visual c++, je viens de me rendre compte que je ne comprends pas comment le compilateur répartit les variables dans la mémoire de l'ordinateur.
    Il fait ce qu'il veut, tu n'as pas a t'en occuper. Il peut meme ne jamais mettre une variable en memoire s'il le juge bon (ce qu'il ne va pas faire si tu prends l'adresse).

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 77
    Par défaut
    Mais dans ce cas, pourquoi ai-je subi tous ces exercices sur les pointeurs du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int a= 1, b= 2;
    int *pa = &a, *pb = &b:
    Sachant que &a = 1130

    donnez :
    &b, pa, pb, ...

    Vous voulez dire que b, pa, pb ne seront pas forcément après a dans la mémoire ?

    Merci de vos infos

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par jomeo
    Mais dans ce cas, pourquoi ai-je subi tous ces exercices sur les pointeurs du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int a= 1, b= 2;
    int *pa = &a, *pb = &b:
    Sachant que &a = 1130

    donnez :
    &b, pa, pb, ...

    Vous voulez dire que b, pa, pb ne seront pas forcément après a dans la mémoire ?
    Gagne. pa et pb peuvent meme n'exister que dans des registres si on n'en prend jamais l'adresse.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Si tu veux que ce soit à la suite, utilise une structure.

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 77
    Par défaut
    Merci de vos précisions.... Bon bah j'oublie les questions sur la position des variables dans la mémoire pour mes exercices :-)

  8. #8
    Membre confirmé Avatar de deeal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 218
    Par défaut
    pa et pb sont places avant , car le compilateur commencent toujours des adresses hautes ffffff et apres il fait une decrementation pour le stack

    donc si je fais

    int a;
    int b; ces variables seront sur le stack de ton thread

    et donc tu as A avant => A aura une plus grande adresse
    disant 1000 , et apres vient b
    qui aura une adresse 1000-4 = 996

    depuis toujours les compilateur (c, et c++ a ma connaissance) travaillent sur le stack en decrementant

  9. #9
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Citation Envoyé par deeal
    depuis toujours les compilateur (c, et c++ a ma connaissance) travaillent sur le stack en decrementant
    C'est lié au processeur et pas au compilateur.

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Et le compilateur est libre de choisir l'ordre dans lequel il met les variables locales.
    Sans oublier les histoires d'alignement si on joue avec des variables de tailles différentes...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre confirmé Avatar de deeal
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 218
    Par défaut
    ah ok, donc ce que j'ai dit, c Visual C++, et Intel processeur
    mais est-ce que ca depend vraiment du processeur?

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Pour être franc, je ne connais pas de processeur avec une pile dont les adresses vont croissant.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc
    Pour être franc, je ne connais pas de processeur avec une pile dont les adresses vont croissant.
    J'en ai deja utilise un. Mais je ne sais plus lequel (MOS 6502? c'etait un 8bits ca je suis certain). Il doit y en avoir d'autres, je suis quasiment certain que le code de alloca de GNU traite le cas. Il y a pire, certains Cray utilisent comme pile une liste chainee. Certains processeurs n'ont pas reellement de notion de pile -- les piles hard sont presque une caracteristique introduite par les micro-processeurs. Avant les ordinateurs stockaient l'adresse de retour a une adresse fixe en memoire, genre adresse du saut moins 1 mot ou dans un registre (ce que font encore des RISC actuels).

  14. #14
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Citation Envoyé par deeal
    ah ok, donc ce que j'ai dit, c Visual C++, et Intel processeur
    mais est-ce que ca depend vraiment du processeur?
    Beaucoup de processeurs ont une gestion de pile pour pouvoir utiliser des sous-programmes. Par exemple pour les x86 il y a les fonctions PUSH/POP et le registre ESP. Le sens de la pile est donc déjà imposé, mais c'est par ailleurs transparent pour le programmeur (sauf quand il réserve de la place/vide la pile sans utiliser de valeur en jouant avec ESP directement). Le compilateur va évidemment utiliser ces possibilités, et donc le sens de fonctionnement lui est imposé.

    Je me demande si la pile du 6502 n'était pas "à l'endroit". J'ai juste trouvé le qualificatif "top down", je ne sais pas quel sens ça fait.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Récupération des variables system...
    Par smyley dans le forum Windows Forms
    Réponses: 7
    Dernier message: 04/08/2005, 11h39
  2. Réponses: 4
    Dernier message: 15/12/2002, 04h19
  3. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 12h44
  4. [VB6] [Fichier] Enregistrer des variables de structure
    Par de.bo dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 07/10/2002, 11h09
  5. Réponses: 4
    Dernier message: 18/07/2002, 13h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo