46 votes

Const vs Static Const

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 ?

43voto

Dietrich Epp Points 72865

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.

7voto

Jens Gustedt Points 40410

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X