2010-11-05 5 views
1
  1. static int i = 0; où sera la variable allouée? Est-ce dans le segment de données BSS ou initialisé?
  2. où seront les variables de classe de stockage 'extern' et 'register' sont stockées?

Je possible s'il vous plaît fournir le code Snippet pour vérifier lesC Carte de mémoire de programme

ci-dessus
+2

Chose amusante: downvotes + favoris. Je suppose que cela signifie "Je ne sais pas la réponse mais je n'aime pas la façon dont vous posez votre question" :) –

+3

@Armen Tsirunyan - Nah, juste plus de gens avec les mêmes devoirs. – Ishtar

+2

Les termes BSS et segment de données initialisé n'ont aucun sens en C. Le standard de langage laisse entièrement à l'implémentation le soin de décider où placer les variables de différentes classes de stockage. – JeremyP

Répondre

3

Il est impossible de dire avec certitude sans connaître l'implémentation spécifique à laquelle vous avez affaire. Dans certains cas, static int i=0; sera stocké dans un segment de données initialisé car vous avez fourni un initialiseur. Dans d'autres cas, le BSS sera initialisé de toute façon, de sorte que l'éditeur de liens le mettra de toute façon à zéro. Si vous avez spécifié une valeur différente (par exemple, static int i=12345;), vous obtiendrez une bien meilleure garantie de son placement dans un segment de données initialisé.

extern ne détermine pas vraiment où le lieur placera la variable. C'est à peu près comme ci-dessus: si l'éditeur de liens sait (ou arrange) que BSS est initialisé à zéro, alors quelque chose qui est extern avec aucun initialiseur spécifié peut être dans BSS. Si BSS n'est pas initialisé à zéro, il doit normalement se trouver dans un segment de données initialisé.

register est fondamentalement équivalent à auto - ils sont tous les deux alloués à l'exécution, typiquement dans un registre ou dans la pile.

En ce qui concerne la vérification, cela devient encore plus dépendant de l'implémentation individuelle. Vous découvrirez généralement en regardant quelque chose comme un fichier de carte de liaison; Si vous voulez le comprendre par vous-même, cela impliquera très probablement de regarder soit le format de symbole utilisé, soit de spéléo les internes du format exécutable pour votre système.

1

Comme cela a été dit précédemment, cela dépend.

Dans mon cas (gcc & Linux), je décide d'aller chercher:

int main (int argc, char **argv) 
{ 
    static int initialized_static_var = 0; 
    static int uninit_static_var; 
    register int reg_var; 
    extern int extern_var; 

    return 0; 
} 

Et puis objdump -x sur le fichier exécutable (édité par souci de concision):

0804a018 l  O .bss 00000004    uninit_static_var.1704 
0804a01c l  O .bss 00000004    initialized_static_var.1703 

Ni la variable de registre ou l'extern non utilisé apparaissent dans la table des symboles, ce qui est logique si vous y réfléchissez.