Question

Pour vérifier que j'ai essayé le code suivant:

const int i = 100;
static int m = 90;
const int p = 40;
int x;

main()
{
    const int j = 40;
    static int k = 40;
    const int n;

    char *p = "Rama";
}

Alors, s'il vous plaît dire quelle variable va quel segment que je suis la sortie suivante sur le compilateur gcc. Quand j'ai écrit

size ./a.out

je suis arrivé:

text   data   bss    dec   hex   filename
865    268     12   1145   479   ./a.out
Était-ce utile?

La solution

Vous pouvez utiliser nm . Voici un exemple: test.c contient l'exemple que vous avez publié:

gcc -o test test.c
nm -p -m test

00001fb0 (__TEXT,__text) non-external (was a private external) dyld_stub_binding_helper
00001fc4 (__TEXT,__text) non-external (was a private external) __dyld_func_lookup
00002010 (__DATA,__data) non-external dyld__mach_header
00002014 (__DATA,__data) non-external _m
00002018 (__DATA,__data) non-external _k.1510
0000200c (__DATA,__data) external _NXArgc
00002008 (__DATA,__data) external _NXArgv
00002000 (__DATA,__data) external ___progname
00001000 (absolute) [referenced dynamically] external __mh_execute_header
00002004 (__DATA,__data) external _environ
00001ff0 (__TEXT,__literal4) external _i
00001fd2 (__TEXT,__text) external _main
00001ff4 (__TEXT,__literal4) external _p
00002038 (__DATA,__common) external _x
00001f70 (__TEXT,__text) external start
         (undefined [lazy bound]) external _exit (from libSystem)

Vous pouvez utiliser la technique décrite de contrôle qui segmenter les variables vont. (Dans MS VC vous pouvez utiliser #pragme data_seg("segname")).

Autres conseils

Les variables et les choses vont là où votre compilateur veut les mettre. Vous pouvez avoir un certain choix sur la façon dont le compilateur se comporte par des options.

Vous aimeriez visiter les liens suivants:

http://en.wikipedia.org/wiki/A.out

http://en.wikipedia.org/wiki/Executable_and_Linkable_Format

Normalement, les données non initialisées entrerait dans BSS et les données initialisées en données (voir ).

Mais ISO C ne prescrit pas ce genre de chose, il est tout à fait une question de mise en œuvre. Le dec et hex dans votre question sont les totaux des trois autres respectivement en décimal et hexadécimal:

865 + 268 + 12 = 1145 = 0x479

Si vous voulez vraiment savoir, il existe différents outils que vous pouvez utiliser, tels que gcc -S lors de la compilation pour obtenir la sortie de langage assembleur ou nm et ses frères regarder à l'intérieur des fichiers objets.

Je pense que tu deviens confus entre le sens de static et const ce qui est compréhensible que vous (et moi!) Oublie souvent leur sens une fois que vous avez lu la théorie une fois.

1) Tout d'abord, const. Qu'est-ce que const signifie que nous ne changerons pas la valeur de la variable à travers cette « référence » à elle. Ceci est vraiment utile pour les arguments de fonction, en particulier lors de l'utilisation des pointeurs, de sorte que vous ne pas modifier les valeurs que vous ne vouliez pas. Par exemple, de façon arbitraire:

void add(int* result, const int* a, const int* b)

Ce moyen de déclaration si nous a = result + b; accidentellement tapé le compilateur doit se plaindre et refuser de compiler. Dans ce cas, nous avons nommé les variables de façon telle que nous ne devrions pas les écraser, même par accident, mais dans des scénarios plus complexes, il peut arriver.

Comme le dit PMG, cependant, cela ne signifie pas la valeur ne changera pas; cela signifie simplement quand on parle de cette version de cette adresse / valeur que nous ne le changer. Mon point ici est qu'il est utile de protéger des arguments que vous n'avez pas l'intention de changer au cas où vous ne accidentellement essayer de les changer. Si vous voulez vraiment une valeur fixe préprocesseur est souvent utilisé, par exemple #define TRUE 1.

2) Maintenant static. des moyens statiques « pas de l'extérieur visible cette unité de compilation ». Cela ressemble, et j'insiste comme, mais pas équivalent à la notion de privé dans les classes, mais dans ce cas, nous parlons ensemble du dossier C. Donc, si nous sommes dans le fichier helloworld.c et en haut vous écrivez:

static int x = 10;

Vous ne pouvez pas utiliser alors cette version de x dans helloworld2.c.

3) Pendant que nous y sommes, nous pourrions aussi bien faire l'autre mot inline. inline est tri d'une façon plus agréable de faire des macros à mon avis et des moyens « compilateur, vous devriez vraiment mettre le code résultant de cela en où vous l'appelez, plutôt que de nous coûter un appel de fonction ». L'optimisation des compilateurs peut le faire de toute façon, mais cela agit comme une instruction explicite en ligne si possible.

En résumé, ces caractéristiques toutes les parties de contrôle de la langue et pas où la variable se placé dans les différents segments de l'exécutable. Comme PMG dit, le compilateur peut faire ce qu'il aime.

Si vous voulez une idée de ce que le compilateur a fait, l'utilisation gcc -S. Cela vous donne la sortie de langage assembleur de gcc qui sera au format AT & T. Essayez ceci avec différents gcc -Ox où les drapeaux de x=0,1,2,3 pour avoir une idée de la façon dont fonctionne l'optimisation.

Enfin, il convient de noter qu'en fait a.out est simplement un nom; votre noyau moderne est probablement compilé sans support pour les fichiers binaires de a.out.

Je pense que la question est que vous essayez vraiment de demander.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top