Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Vocabulaire : variable locale

19 réponses
Avatar
candide
Bonjour,

Êtes-vous d'accord avec la définition suivante :

"Pour qu'une variable soit locale (ou automatique) il faut que sa portée soit
locale ainsi que sa persistance. "

?

La norme ne parle pas de variable locale/globale mais y-a-t-il un usage admis ?

9 réponses

1 2
Avatar
Marc Boyer
On 2009-02-03, Wykaaa wrote:
candide a écrit :
Wykaaa a écrit :

Et pour cause car c'est ambigu.



C'est vrai puisque ça peut référer à l'identificateur (portée) et un objet (durée)

Il faut distinguer la classe d'allocation mémoire (auto, static, extern,
const, etc.)



const n'est pas une classe de mémorisation.



Si, c'est une classe de mémorisation puisqu'un (bon) compilateur la
traiter différemment en l'allouant en mémoire non écrivible.
Typiquement, sur une machine à segments mémoire, les variables const
seront allouées dans un segment "unwritable".



Ah ? Et comment faire avec ce code:

#include <stdlib.h>
void foo(){
const int l= rand();
}

Marc Boyer
--
Au XXIème siècle, notre projet de société s'est réduit
à un projet économique...
Avatar
Wykaaa
Marc Boyer a écrit :
On 2009-02-03, Wykaaa wrote:
candide a écrit :
Wykaaa a écrit :

Et pour cause car c'est ambigu.


C'est vrai puisque ça peut référer à l'identificateur (portée) et un objet (durée)

Il faut distinguer la classe d'allocation mémoire (auto, static, extern,
const, etc.)


const n'est pas une classe de mémorisation.


Si, c'est une classe de mémorisation puisqu'un (bon) compilateur la
traiter différemment en l'allouant en mémoire non écrivible.
Typiquement, sur une machine à segments mémoire, les variables const
seront allouées dans un segment "unwritable".



Ah ? Et comment faire avec ce code:

#include <stdlib.h>
void foo(){
const int l= rand();
}

Marc Boyer


C'est une const auto. Elle sera allouée à chaque entrée dans la fonction
et désallouée en sortie dans une zone non écrivible.
Avatar
Marc Boyer
On 2009-02-04, Wykaaa wrote:
Marc Boyer a écrit :
On 2009-02-03, Wykaaa wrote:
candide a écrit :
Wykaaa a écrit :

Et pour cause car c'est ambigu.


C'est vrai puisque ça peut référer à l'identificateur (portée) et un objet (durée)

Il faut distinguer la classe d'allocation mémoire (auto, static, extern,
const, etc.)


const n'est pas une classe de mémorisation.


Si, c'est une classe de mémorisation puisqu'un (bon) compilateur la
traiter différemment en l'allouant en mémoire non écrivible.
Typiquement, sur une machine à segments mémoire, les variables const
seront allouées dans un segment "unwritable".



Ah ? Et comment faire avec ce code:

#include <stdlib.h>
void foo(){
const int l= rand();
}



C'est une const auto. Elle sera allouée à chaque entrée dans la fonction
et désallouée en sortie dans une zone non écrivible.



Hum. Les OS ont du pas mal changer alors.
Moi, j'en était resté au fait que c'était une page complète
qui avait l'attribut rw/r, et aller allouer toute une page pour
y mettre 32-64 bits... Sans parler du fait qu'on aimait bien
allouer ce genre de chose sur une pile... Et se trainer deux
piles, une de var const, une de var non const...
On pourrait aussi faire sauter l'attribut read-only de
la page, aller y allouer l avec sa valeur initiale,
remettre l'attribut read-only...

Ca me semble bien compliqué tout ça...

Marc Boyer
--
Au XXIème siècle, notre projet de société s'est réduit
à un projet économique...
Avatar
Wykaaa
Marc Boyer a écrit :
On 2009-02-04, Wykaaa wrote:
Marc Boyer a écrit :
On 2009-02-03, Wykaaa wrote:
candide a écrit :
Wykaaa a écrit :

Et pour cause car c'est ambigu.


C'est vrai puisque ça peut référer à l'identificateur (portée) et un objet (durée)

Il faut distinguer la classe d'allocation mémoire (auto, static, extern,
const, etc.)


const n'est pas une classe de mémorisation.


Si, c'est une classe de mémorisation puisqu'un (bon) compilateur la
traiter différemment en l'allouant en mémoire non écrivible.
Typiquement, sur une machine à segments mémoire, les variables const
seront allouées dans un segment "unwritable".


Ah ? Et comment faire avec ce code:

#include <stdlib.h>
void foo(){
const int l= rand();
}



C'est une const auto. Elle sera allouée à chaque entrée dans la fonction
et désallouée en sortie dans une zone non écrivible.



Hum. Les OS ont du pas mal changer alors.
Moi, j'en était resté au fait que c'était une page complète
qui avait l'attribut rw/r, et aller allouer toute une page pour
y mettre 32-64 bits... Sans parler du fait qu'on aimait bien
allouer ce genre de chose sur une pile... Et se trainer deux
piles, une de var const, une de var non const...
On pourrait aussi faire sauter l'attribut read-only de
la page, aller y allouer l avec sa valeur initiale,
remettre l'attribut read-only...

Ca me semble bien compliqué tout ça...

Marc Boyer


Ce n'est pas une obligation de le faire mais c'est ce que devrait faire
un compilateur si la machine cible (architecture et jeu d'instructions)
le permet.
Avatar
espie
In article <49897dd5$0$9392$,
Wykaaa wrote:
Ce n'est pas une obligation de le faire mais c'est ce que devrait faire
un compilateur si la machine cible (architecture et jeu d'instructions)
le permet.



La sur le coup, je donne raison a Marc Boyer.
La plupart des architectures que je connais supportent simplement une seule
pile, et il n'y a pas possibilite de marquer facilement une adresse de cette
pile comme non-ecrivable.

Le seul cas ou un compilateur va effectivement fabriquer des constantes,
c'est s'il est suffisamment doue pour determiner qu'il s'agit d'une fonction
"finale" (leaf function ? comment traduire ?)... et encore. faudra un coup
d'appel systeme pour marquer la zone comme non-ecrivable.

Vu l'environnement dans lequel je bosse (OpenBSD), je suis assez bien place
pour savoir que la protection en lecture a un cout, et que mettre en place
plein de zones avec des attributs differents egalement: c'est un sacre
bazar pour faire marcher des bibliotheques partagees avec le maximum de
chose en read-only, par exemple, entre les zones ou l'editeur de liens
dynamique doit avoir acces, et les contraintes de distance entre blocs
de code... et tout mprotect coute cher.
Avatar
Wykaaa
Marc Espie a écrit :
In article <49897dd5$0$9392$,
Wykaaa wrote:
Ce n'est pas une obligation de le faire mais c'est ce que devrait faire
un compilateur si la machine cible (architecture et jeu d'instructions)
le permet.



La sur le coup, je donne raison a Marc Boyer.
La plupart des architectures que je connais supportent simplement une seule
pile, et il n'y a pas possibilite de marquer facilement une adresse de cette
pile comme non-ecrivable.

Le seul cas ou un compilateur va effectivement fabriquer des constantes,
c'est s'il est suffisamment doue pour determiner qu'il s'agit d'une fonction
"finale" (leaf function ? comment traduire ?)... et encore. faudra un coup
d'appel systeme pour marquer la zone comme non-ecrivable.

Vu l'environnement dans lequel je bosse (OpenBSD), je suis assez bien place
pour savoir que la protection en lecture a un cout, et que mettre en place
plein de zones avec des attributs differents egalement: c'est un sacre
bazar pour faire marcher des bibliotheques partagees avec le maximum de
chose en read-only, par exemple, entre les zones ou l'editeur de liens
dynamique doit avoir acces, et les contraintes de distance entre blocs
de code... et tout mprotect coute cher.



Je suis entièrement d'accord avec toi.
Je n'ai peut-être pas été assez explicite mais quand je disais "si la
machine cible (architecture et jeu d'instructions) le permet", cela
sous-entendait, implicitement, modulo des problèmes de coûts.
J'ai eu la chance de faire un compilateur C pour une machine cible au
"décor interne" très riche qui permettait ce genre de chose sans que
cela soit à un coût prohibitif.
Avatar
Antoine Leca
Le 04/02/2009 11:24, Wykaaa écrivit :
Marc Boyer a écrit :
Ah ? Et comment faire avec ce code:

#include <stdlib.h>
void foo(){
const int l= rand();
}



C'est une const auto. Elle sera allouée à chaque entrée dans la fonction



Oui

et désallouée en sortie



Je ne sais pas ce que cela veut dire en C.

> dans une zone non écrivible.

M'étonnerait qu'il y ait beaucoup de compilateurs qui se donne la peine
de faire cela (déprotéger la zone, écrire la valeur au moment de
l'allocation, reprotéger ; et au prochain appel on recommence).

Il est plus probable que l'objet (ou même seulement le nom) soit marqué
«const» au niveau des tables internes du compilateur (ce qui permet
d'injurier autant que faire se veut le programmeur), mais que du point
de vue externe tout se passe comme si l'objet était normal.

D'un autre côté, cela c'est la cuisine... Officiellement, il est
possible de faire ce que tu dis.


Antoine
Avatar
Antoine Leca
Le 04/02/2009 13:33, Marc Espie écrivit :
[...] qu'il s'agit d'une fonction "finale" (leaf function ? comment traduire ?)...



terminale ?


Antoine
Avatar
Marc Boyer
On 2009-02-04, Wykaaa wrote:
Marc Boyer a écrit :
On 2009-02-04, Wykaaa wrote:
Marc Boyer a écrit :
On 2009-02-03, Wykaaa wrote:
Si, c'est une classe de mémorisation puisqu'un (bon) compilateur la
traiter différemment en l'allouant en mémoire non écrivible.
Typiquement, sur une machine à segments mémoire, les variables const
seront allouées dans un segment "unwritable".


Ah ? Et comment faire avec ce code:

#include <stdlib.h>
void foo(){
const int l= rand();
}



C'est une const auto. Elle sera allouée à chaque entrée dans la fonction
et désallouée en sortie dans une zone non écrivible.



Hum. Les OS ont du pas mal changer alors.
Moi, j'en était resté au fait que c'était une page complète
qui avait l'attribut rw/r, et aller allouer toute une page pour
y mettre 32-64 bits... Sans parler du fait qu'on aimait bien
allouer ce genre de chose sur une pile... Et se trainer deux
piles, une de var const, une de var non const...
On pourrait aussi faire sauter l'attribut read-only de
la page, aller y allouer l avec sa valeur initiale,
remettre l'attribut read-only...

Ca me semble bien compliqué tout ça...



Ce n'est pas une obligation de le faire mais c'est ce que devrait faire
un compilateur si la machine cible (architecture et jeu d'instructions)
le permet.



Oui, je sais bien.
C'était juste qu'avec le C, les choses sont rarement simples,
et pour souligner que les règles du genre "les variables const
seront allouées dans un segment unwritable" ont des contre exemples
faciles.

Marc Boyer
--
Au XXIème siècle, notre projet de société s'est réduit
à un projet économique...
1 2