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 :

Variables statiques et allocation dynamique


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut Variables statiques et allocation dynamique
    Bonjour

    J'ai une question sur les variables static, plus exactement sur la différence entre l'allocation des variables statiques et l'allocation dynamique. Sur wiki, on a:

    This is in contrast to the more ephemeral automatic variables (local variables), whose storage is allocated and deallocated on the call stack; and in contrast to objects whose storage is dynamically allocated.
    C'est justement cette phrase:

    and in contrast to objects whose storage is dynamically allocated.
    que je veux qu'on m'explique

    Merci

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    Simplement que les objets "locaux" sont alloué sur la pile (mémoire limitée) alors que les objets dynamiques sont alloués sur le tas (moins limité). C'est juste un problème de gestion de la mémoire par l'OS.

  3. #3
    screetch
    Invité(e)
    Par défaut
    la question portant sur les variables statiques:

    * une variable locale est sur la pile, un segment de mémoire alloué lors de la création du thread (et il y a au moins 1 thread par processus)
    * une variable alloué dynamiquement réside dans la mémoire allouée par le programme lui même
    * une variable statique est allouée "dans le programme" lui même; le programme a une section de mémoire ou il va mettre la variable globale.
    Regarde cet exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
        int x = 42;
        printf("%d\n", x);
        return EXIT_SUCCESS;
    }
    l'executable généré sur ma machine: -rwxr-xr-x 1 screetch Administrators 48114 Nov 10 12:26 a.execelui la: la variable locale devient statique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    #include <stdlib.h>
     
    static int x = 42;
    int main(int argc, char *argv[])
    {
        printf("%d\n", x);
        return EXIT_SUCCESS;
    }
    -rwxr-xr-x 1 screetch Administrators 48132 Nov 10 12:28 a.exel'executable a grossi.
    maintenant, essayons même de voir de plus près avec la commande objdump pour afficher le contenu de l'executable:

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    objdump -h a.exe
     
     
    a.exe:     file format pei-i386
     
    Sections:
    Idx Name          Size      VMA       LMA       File off  Algn
      0 .text         00000bcc  00401000  00401000  00000600  2**2
                      CONTENTS, ALLOC, LOAD, READONLY, CODE, DATA
      1 .data         00000014  00402000  00402000  00001200  2**2
                      CONTENTS, ALLOC, LOAD, DATA
      2 .rdata        00000118  00403000  00403000  00001400  2**2
                      CONTENTS, ALLOC, LOAD, READONLY, DATA
      3 .eh_frame     000000d4  00404000  00404000  00001600  2**2
                      CONTENTS, ALLOC, LOAD, READONLY, DATA
      4 .bss          00000078  00405000  00405000  00000000  2**2
                      ALLOC
      5 .idata        00000364  00406000  00406000  00001800  2**2
                      CONTENTS, ALLOC, LOAD, DATA
      6 .CRT          00000018  00407000  00407000  00001c00  2**2
                      CONTENTS, ALLOC, LOAD, DATA
      7 .tls          00000020  00408000  00408000  00001e00  2**2
                      CONTENTS, ALLOC, LOAD, DATA
      8 .debug_aranges 000000e0  00409000  00409000  00002000  2**0
                      CONTENTS, ALLOC, LOAD, READONLY, DATA, DEBUGGING
      9 .debug_pubnames 00000388  0040a000  0040a000  00002200  2**0
                      CONTENTS, ALLOC, LOAD, READONLY, DATA, DEBUGGING
     10 .debug_pubtypes 00000469  0040b000  0040b000  00002600  2**0
                      CONTENTS, ALLOC, LOAD, READONLY, DATA, DEBUGGING
     11 .debug_info   00002636  0040c000  0040c000  00002c00  2**0
                      CONTENTS, ALLOC, LOAD, READONLY, DATA, DEBUGGING
     12 .debug_abbrev 000008de  0040f000  0040f000  00005400  2**0
                      CONTENTS, ALLOC, LOAD, READONLY, DATA, DEBUGGING
     13 .debug_line   00000698  00410000  00410000  00005e00  2**0
                      CONTENTS, ALLOC, LOAD, READONLY, DATA, DEBUGGING
     14 .debug_frame  000003c4  00411000  00411000  00006600  2**2
                      CONTENTS, ALLOC, LOAD, READONLY, DATA, DEBUGGING
     15 .debug_str    0000010f  00412000  00412000  00006a00  2**0
                      CONTENTS, ALLOC, LOAD, READONLY, DATA, DEBUGGING
     16 .debug_loc    00000af1  00413000  00413000  00006c00  2**0
                      CONTENTS, ALLOC, LOAD, READONLY, DATA, DEBUGGING
     17 .debug_ranges 00000048  00414000  00414000  00007800  2**0
                      CONTENTS, ALLOC, LOAD, READONLY, DATA, DEBUGGING
    la section interessante est la section data; elle contient les variables globales/statiques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ objdump -s -j .data a.exe
     
    a.exe:     file format pei-i386
     
    Contents of section .data:
     402000 2a000000 ffffffff 00400000 c81b4000  *........@....@.
     402010 00000000
    hmm hmmm, 2a000000 c'est exactement 42 en hexadécimal c'est donc "dans l'executable" que la variable globale a été casée.

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    la question portant sur les variables statiques
    J'ai l'impression (en lisant le texte du wiki en anglais) que la question porte sur les variables locales et non sur les variables "static". Je pense à un abus de langage du PO.

  5. #5
    screetch
    Invité(e)
    Par défaut
    http://en.wikipedia.org/wiki/Static_variable

    les variables statiques y sont comparées aux variables locales et aux variables dynamiques

Discussions similaires

  1. Allocation dynamique d'une variable dans une dll -> Crash
    Par Rominitch dans le forum Langage
    Réponses: 2
    Dernier message: 04/04/2014, 21h18
  2. Appel dynamique d'une variable statique
    Par rolintoucour dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 09/04/2012, 20h40
  3. Réponses: 11
    Dernier message: 11/06/2008, 18h05
  4. allocation dynamique de variable
    Par rmac2050 dans le forum C#
    Réponses: 5
    Dernier message: 01/02/2008, 18h20
  5. Réponses: 14
    Dernier message: 26/10/2006, 14h44

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