Comment le compilateur (ex. GCC) alloue-t-il const
y static const
variable, comme dans, où il résiderait ? Dans la mémoire de données ou dans la mémoire du programme ?
Réponses
Trop de publicités?Cela dépend de votre système et de la façon dont vous utilisez la variable. Pour static
variables :
Cas 1 : Vous n'utilisez jamais la variable, et le compilateur la rejette silencieusement. Cela ne peut pas se produire avec extern
variables.
Cas 2 : Vous utilisez la variable, mais vous ne prenez jamais son adresse. Le compilateur convertit l'utilisation de la variable en opérandes immédiats, tout comme s'il s'agissait d'une variable #define
o enum
. Le compilateur peut toujours convertir extern
statique aux opérandes immédiats, mais il doit quand même trouver une adresse pour lui.
Cas 3 : Vous utilisez la variable et prenez son adresse, le compilateur est obligé de trouver un endroit pour la placer dans le code objet, exactement comme s'il s'agissait de extern
.
En ce qui concerne la mémoire "données" par rapport à la mémoire "programme", cela dépend du système que vous utilisez. Sur mon système Linux x64/ELF, il sera probablement placé dans la mémoire de type .rodata
qui va dans le même segment que le code ( .text
), mais un segment différent des sections de données en lecture-écriture ( .bss
, .data
). Mon système semble ne pas créer de segment distinct pour les données non exécutables en lecture seule.
Addendum : Notez que le comportement est différent en C++. En C++, un const
a un lien interne par défaut, donc static const
est redondant et extern const
est nécessaire pour obtenir une constante avec une liaison externe.
Dietrich a déjà expliqué le cas de static
variables bien.
Pour les variables locales, l'implémentation du compilateur a plusieurs choix quant à l'endroit où allouer une variable locale. const
variable qualifiée pour laquelle l'adresse est prise. Elle peut être allouée ou non sur la pile ou en mémoire statique. C'est notamment le cas pour const
des littéraux composés qualifiés. Les adresses de deux de ces littéraux qui sont déclarés localement dans des portées différentes peuvent être regroupées en une seule et leurs adresses peuvent être égales.