allocation variable dans les segments
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
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:
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.