La mémoire allouée à la compilation signifie que le compilateur décide au moment de la compilation, où certaines choses seront allouées à l'intérieur du processus de la mémoire de la carte.
Par exemple, considérons un réseau mondial:
int array[100];
Le compilateur sait au moment de la compilation, la taille du tableau et la taille de l' int
, de sorte qu'il sait de la taille complète de la matrice au moment de la compilation. Aussi une variable globale est statique de la durée de stockage par défaut: il est alloué dans la mémoire statique de la zone de la mémoire du processus de l'espace (.de données/.bss). Compte tenu de cette information, le compilateur décide lors de la compilation de ce que l'adresse de cette zone de mémoire statique, le tableau sera.
Bien sûr que la mémoire les adresses sont des adresses virtuelles. Le programme suppose qu'elle a son propre ensemble de la mémoire de l'espace (à Partir de 0x00000000 à 0xFFFFFFFF par exemple). C'est pourquoi le compilateur pourrait faire des hypothèses comme "d'Accord, le tableau sera à l'adresse 0x00A33211". Au moment de l'exécution que les adresses sont convertis à la vraie/adresses matérielles par la MMU et les OS.
La valeur initialisée stockage statique, les choses sont un peu différentes. Par exemple:
int array[] = { 1 , 2 , 3 , 4 };
Dans notre premier exemple, le compilateur ne décide de l'endroit où le tableau sera alloué, stocker cette information dans le fichier exécutable.
Dans le cas d'une valeur initialisée choses, le compilateur permet aussi d'injecter de la valeur initiale de la matrice dans l'exécutable, et ajoute le code qui indique le programme loader après le tableau de répartition au démarrage du programme, le tableau doit être rempli avec ces valeurs.
Voici deux exemples de l'assembly généré par le compilateur (GCC4.8.1 avec x86):
Le code C++:
int a[4];
int b[] = { 1 , 2 , 3 , 4 };
int main()
{}
La sortie de l'assemblée:
a:
.zero 16
b:
.long 1
.long 2
.long 3
.long 4
main:
pushq %rbp
movq %rsp, %rbp
movl $0, %eax
popq %rbp
ret
Comme vous pouvez le voir, les valeurs sont injectés directement dans l'assemblée. Dans le tableau a
, le compilateur génère un zéro initialisation de 16 octets, parce que la Norme dit que statique stockées choses doit être initialisé à zéro par défaut:
8.5.9 (Initialiseurs) [Note]:
Chaque objet de la statique de la durée de stockage est initialisé à zéro à
le démarrage du programme, avant toute autre initialisation a lieu. Dans certains
cas échéant, d'autres l'initialisation est faite plus tard.
J'ai toujours penser que les personnes à démontage leur code pour voir ce que le compilateur n'a vraiment avec le code C++. Cela s'applique à partir de classes de stockage/durée (comme cette question) à avancé les optimisations du compilateur. Vous pourriez demander à votre compilateur pour générer de l'assemblée, mais il y a de merveilleux outils pour ce faire sur l'Internet d'une manière amicale. Ma préférée est la GCC Explorer.