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 :

Pourquoi : 'Global' et 'Static'?


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Points : 23
    Points
    23
    Par défaut Pourquoi : 'Global' et 'Static'?
    Bonjour à tous et à toutes,

    J'apprécie de developper en C, et essaye toujours de réduire au maximum la portée des fonctions et/ou des varibales (variable non-globale et fonction statique) car (selon moi):
    -C'était plus logique-cohérent
    -C'était plus sécurisé (bien que je n'ai pas l'impression qu'on en parle beaucoup)

    Pour la cohérence je reste toujours d'accord.
    Mais une question m'est restée, pourquoi est-ce que cela est plus sécurisé?
    Est-ce bien vrai?

    Y a t-il une différence entre l'espace mémoire d'une variable globale et non-globale (ou de fonction static et non-static)?
    Pourriez-vous me donner des exemples concrets?

    Merci

    Bonne journée!

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Bonjour,

    En ce qui concerne les variables globales, c'est toujours une bonne idée de les éviter. La liste exhaustive des raisons n'est pas toujours facile à établir mais on peut au moins retenir celles-ci :

    • Contrairement à celui des variables locales, l'espace des variables globales n'est jamais libéré au cours de l'exécution d'un processus. Ce seul point est déjà, en soi, une raison suffisante pour éviter d'y recourir. :-)
    • Les globales ne sont pas établies au même endroit que les locales (qui vont dans la pile) ;
    • Les variables globales sont délicates à utiliser avec les threads (et le problème se pose aussi avec les variables statiques). En particulier, les globales sont visibles d'un thread à l'autre (voir Thread Local Storage). Ça peut être un bien comme un mal ;
    • L'usage de variables locales permet d'utiliser le même nom de variable là où cela se justifie. Sans notion de portée, on arriverait vite à court de noms valables, ce qui serait très pénible dans le cas de boucles imbriquées, spécialement d'une fonction à l'autre. Imagine un peu que tu ne puisses pas utiliser la variable « x », par exemple, parce l'auteur d'une des nombreuses bibliothèques que tu utilises l'a déjà déclarée en globale pour son propre compte… Ce point-ci est particulièrement important lorsque l'on développe en équipe ;
    • Une fonction à variable globale n'est pas ré-entrante : personne ne peut appeler la fonction tant que le premier appelant n'est pas ressorti ;
    • Par extension : une fonction à variable globale ne peut pas être récursive (sauf si la variable globale en question est un accumulateur). C'est génant ;
    • Enfin, l'utilisation de locales strictement limitées au périmètre qui est censé être le leur permet d'éviter les homonymies : une variable locale invoquée hors de son bloc se traduira par un message « variable indéfinie » à la compilation. S'il reste une globale qui porte le même nom, le code compilera sans erreur et y fera référence plutôt qu'à la locale, à l'insu du programmeur.


    Pour les fonctions static, c'est déjà moins grave et moins vérifié par conséquent mais le principe reste le même : éviter de polluer le namespace en mélangeant les appels légitimes et les fonctions à usage interne uniquement, qui ne devraient être appelées que par le programme et pas par l'utilisateur. Cela permet également, en cas de programmation en équipe, de donner la possibilité à deux programmeurs distincts d'utiliser les mêmes noms de fonctions internes sans risquer de se marcher sur les pieds

    Concernant ce dernier point, ce n'est pas que du confort : il peut être intéressant d'avoir une fonction par module portant toujours le même nom partout dans un projet, par exemple cleanup().

  3. #3
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Si tu es sous unix/linux, tu peux aussi voir que les variables globales et/ou statiques sont accessible/visible depuis l'extérieur de ton exe/lib car elles apparaissent dans sa table des symboles.

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    int VISIBLEGLOB = 0
    ..
    int maFonction {                                                                                                                                           
      static  int VISIBLE = 0;
      int PASVISIBLE = 0;
     
      return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $nm monProg
    ...
    0000000000600b2c b VISIBLE.2650
    0000000000600b28 B VISIBLEGLOB
    ...
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Points : 23
    Points
    23
    Par défaut
    Les globales ne sont pas établies au même endroit que les locales (qui vont dans la pile)
    Elles sont donc stockées dans le tas? Ou est-ce une autre zone que je ne connais pas?

    Je me demandais également, est-ce normal qu'une fonction static apparaissent dans la table des symboles?

    En tout cas merci de vos réponses complètes, ca fait plaisir à lire!

    Bonne soirée,

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par ugo188 Voir le message
    Elles sont donc stockées dans le tas? Ou est-ce une autre zone que je ne connais pas?

    Je me demandais également, est-ce normal qu'une fonction static apparaissent dans la table des symboles?

    En tout cas merci de vos réponses complètes, ca fait plaisir à lire!

    Bonne soirée,
    Visible oui ... mais je ne pense pas qu'elle soit accessible pour autant. Je veux dire par là, que sous linux avec nm, on verra bien le nom de la variable ... mais on ne pourra pas y acceder depuis l'exterier ( juste dans l'unité de compilation, ce qui est normal ).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Points : 23
    Points
    23
    Par défaut
    Visible oui ... mais je ne pense pas qu'elle soit accessible pour autant.
    Ah bah je pensais...
    Faudrait faire des tests

  7. #7
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 55
    Points : 23
    Points
    23
    Par défaut
    Bah si on parle de globale se serait plutôt 'heap overflow',
    puisqu'elles ne semblent pas être stockée sur la pile.

  9. #9
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    Non, les variables statiques ne sont pas stockées dans le tas, mais dans une autre zone:

    http://de-lafond.com/La%20doc/Les%20...1/memoire.html

  10. #10
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par haraelendil Voir le message
    Non, les variables statiques ne sont pas stockées dans le tas, mais dans une autre zone:

    http://de-lafond.com/La%20doc/Les%20...1/memoire.html
    si j'en crois nm concernant les static

    0000000000600b2c b VISIBLE.2650
    0000000000600b28 B VISIBLEGLOB

    "B" The symbol is in the uninitialized data section (known as BSS).
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Euh....Je lis ce sujet et je pose une question bête : c'est quoi le tas ?

  12. #12
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Euh....Je lis ce sujet et je pose une question bête : c'est quoi le tas ?
    http://fr.wikipedia.org/wiki/Allocation_de_m%C3%A9moire
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  13. #13
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Merci bien !

Discussions similaires

  1. pourquoi on utilise static pour connBD
    Par moooona dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 11/06/2008, 17h33
  2. Réponses: 6
    Dernier message: 12/09/2007, 17h31
  3. Accéder aux variables static du Global.asax
    Par tscoops dans le forum ASP.NET
    Réponses: 3
    Dernier message: 10/04/2007, 14h41
  4. Réponses: 24
    Dernier message: 08/05/2006, 23h12
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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