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 :

mémoire occupée par les variables locales


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 79
    Par défaut mémoire occupée par les variables locales
    Bonjour,

    J'ai un code qui ressemble à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    {
      int NbChaussettes = ...
      blablabla
    }
    {
      int NbPantalons = ...
      blablabla
    }
    {
      int NbChemises = ...
      blablabla
    }
    {
      int NbChaussures = ...
      blablabla
    }
    Il n'a donc jamais plus d'un int déclaré, visible et utilisable en même temps.

    Est ce que quelqu'un saurait si la place utilisée dans la mémoire du programme pour ces variables est de 4 int ou de 1 int?
    Merci pour vos réponses!

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par nonozor Voir le message
    Est ce que quelqu'un saurait si la place utilisée dans la mémoire du programme pour ces variables est de 4 int ou de 1 int?
    Cela peut dépendre du compilateur...

    Pour vérifier, dans chaque bloc { }, affiche sur la console l'adresse de la variable. Si les quatre entiers ont la même, c'est que ton compilateur n'alloue qu'un seul entier sur la pile. S'ils sont différents, c'est qu'il alloue séparément chaque variable, même si elles sont dans des portées disjointes.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Le langage te garantie que le constructeur est appelé à la définition de la variable et le destructeur est appelé lorsque celle-ci sort de son scope.
    En revanche, la gestion de la pile dépend du compilateur et de la taille de la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <iostream>
     
    template<int N>
    void Dump()
    {
       {
         int NbChaussettes[N];
         std::cout<<NbChaussettes<<std::endl;
       }
       {
         int NbPantalons[N];
         std::cout<<NbPantalons<<std::endl;
       }
       {
         int NbChemises[N];
         std::cout<<NbChemises<<std::endl;
       }
       {
         int NbChaussures[N];
         std::cout<<NbChaussures<<std::endl;
       }
    }
    int main()
    {
       std::cout<<"1 : "<<std::endl;
       Dump<1>();
       std::cout<<"1024 : "<<std::endl;
       Dump<1024>();
       return 0;
    }
    Produit avec Visual C++ :
    1 :
    0012FF5C
    0012FF58
    0012FF54
    0012FF50
    1024 :
    0012EF60
    0012DF60
    0012CF60
    0012BF60
    -> On voit qu'on a une zone différente sur la pile à chaque fois.
    Et avec MinGW :
    1 :
    0x22ff54
    0x22ff50
    0x22ff4c
    0x22ff48
    1024 :
    0x22ef58
    0x22ef58
    0x22ef58
    0x22ef58
    -> On voit qu'on a une zone différente sur la pile pour 1 et la même pour 1024.

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    @3DArchi : tu as fait le test en Debug, en Release, les deux ? Juste pour savoir... Parce que ça ne m'étonnerait pas que Visual ne "compacte" les grosses variables qu'en mode Release, à cause notamment des valeurs de remplissages en mode Debug...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    @3DArchi : tu as fait le test en Debug, en Release, les deux ? Juste pour savoir... Parce que ça ne m'étonnerait pas que Visual ne "compacte" les grosses variables qu'en mode Release, à cause notamment des valeurs de remplissages en mode Debug...
    Le test est en debug. Effectivement, il y a peut être un compactage en Release. L'idée est surtout de montrer qu'il s'agit d'un choix d'implémentation et qu'il vaut mieux ne pas spéculer sur la façon dont la pile est gérée.

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Le test est en debug. Effectivement, il y a peut être un compactage en Release.
    OK, merci.

    Citation Envoyé par 3DArchi Voir le message
    L'idée est surtout de montrer qu'il s'agit d'un choix d'implémentation et qu'il vaut mieux ne pas spéculer sur la façon dont la pile est gérée.
    Ah ça, on est bien d'accord !!!
    La seule chose garantie avec les variables locales, c'est ... qu'elles sont sur la pile. Mais la façon dont c'est implémenté ne devrait jamais être une hypothèse de travail.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    La seule chose garantie avec les variables locales, c'est ... qu'elles sont sur la pile.
    Même pas, il n'y a pas de notion de pile dans la norme. La seule chose dont on est certain c'est de la portée des variables locales.

    [HS]
    J'ai travaillé sur des systèmes où les variables locales étaient mise dans la même page de working data que les variables globales, le compilateur et le linker se débrouillaient pour les organiser correctement et pour recycler les zones mémoires des variables locales (pas assez de place dans la pile).

    De même, à fin d'optimisation, certaines variables locales ne peuvent n'être présente que dans les registres du processeurs.
    [/HS]

Discussions similaires

  1. text, ntext et image sont interdits dans les variables locales
    Par Sebounet19 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 04/07/2013, 15h44
  2. Mémoire utilisée par les variables
    Par Tintou dans le forum VBA Access
    Réponses: 1
    Dernier message: 19/09/2008, 14h33
  3. Espace disque occupé par les données
    Par klereth dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 13/12/2005, 13h18
  4. Supprimer la mémoire utilisée par les variables globales
    Par dnaprotector dans le forum OpenGL
    Réponses: 4
    Dernier message: 21/07/2005, 13h18
  5. [JVM] Connaitre la taille mémoire utilisé par les dif classe
    Par sur_uix dans le forum Général Java
    Réponses: 4
    Dernier message: 18/09/2003, 09h17

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