Lisant parfois du code avec ces mots réservés, je me demande maintenant
quelles sont les fonctionnalités de ces deux mots.
Lisant parfois du code avec ces mots réservés, je me demande maintenant
quelles sont les fonctionnalités de ces deux mots.
Lisant parfois du code avec ces mots réservés, je me demande maintenant
quelles sont les fonctionnalités de ces deux mots.
Merci pour l'explication de mutable, est-ce que cela
est souvent employé ?
Merci pour l'explication de mutable, est-ce que cela
est souvent employé ?
Merci pour l'explication de mutable, est-ce que cela
est souvent employé ?
Bonjour à tous,
Lisant parfois du code avec ces mots réservés, je me demande maintenant
quelles sont les fonctionnalités de ces deux mots.
Bonjour à tous,
Lisant parfois du code avec ces mots réservés, je me demande maintenant
quelles sont les fonctionnalités de ces deux mots.
Bonjour à tous,
Lisant parfois du code avec ces mots réservés, je me demande maintenant
quelles sont les fonctionnalités de ces deux mots.
imagine que tu veux réaliser une liste (sans utilisé la STL) chainé
encapsuler dans une classe et accessible par 2 methodes :
a.init() qui place "l'iterateur" au debut de la liste.
a.lire() qui retourne l'objet et place l'iterateur sur l'objet suivant
cette classe contiendrait ces attribut
un_pointeur_du_debut_de_la_liste
un_pointeur_iterateur
la methode init() fait donc
un_pointeur_du_debut_de_la_liste=un_pointeur_iterateur;
la methode lire() fait un_pointeur_iterateur > un_pointeur_iterateur->suivant();
Tout fonctionne a merveille jusqu'a ce que l'on souhaite être un peu plus
stricte :
init() et lire() ne modifie en rien la structure de donné, il devrait etre
donc déclaré "const". Mais voila, il modifie un membre de la classe, donc
pas possible!!!
Ben pour resoudre ce problème, il suffit de déclarer
mutable un_pointeur_iterateur;
Et tout fonctionne pour le mieu ;-)
imagine que tu veux réaliser une liste (sans utilisé la STL) chainé
encapsuler dans une classe et accessible par 2 methodes :
a.init() qui place "l'iterateur" au debut de la liste.
a.lire() qui retourne l'objet et place l'iterateur sur l'objet suivant
cette classe contiendrait ces attribut
un_pointeur_du_debut_de_la_liste
un_pointeur_iterateur
la methode init() fait donc
un_pointeur_du_debut_de_la_liste=un_pointeur_iterateur;
la methode lire() fait un_pointeur_iterateur > un_pointeur_iterateur->suivant();
Tout fonctionne a merveille jusqu'a ce que l'on souhaite être un peu plus
stricte :
init() et lire() ne modifie en rien la structure de donné, il devrait etre
donc déclaré "const". Mais voila, il modifie un membre de la classe, donc
pas possible!!!
Ben pour resoudre ce problème, il suffit de déclarer
mutable un_pointeur_iterateur;
Et tout fonctionne pour le mieu ;-)
imagine que tu veux réaliser une liste (sans utilisé la STL) chainé
encapsuler dans une classe et accessible par 2 methodes :
a.init() qui place "l'iterateur" au debut de la liste.
a.lire() qui retourne l'objet et place l'iterateur sur l'objet suivant
cette classe contiendrait ces attribut
un_pointeur_du_debut_de_la_liste
un_pointeur_iterateur
la methode init() fait donc
un_pointeur_du_debut_de_la_liste=un_pointeur_iterateur;
la methode lire() fait un_pointeur_iterateur > un_pointeur_iterateur->suivant();
Tout fonctionne a merveille jusqu'a ce que l'on souhaite être un peu plus
stricte :
init() et lire() ne modifie en rien la structure de donné, il devrait etre
donc déclaré "const". Mais voila, il modifie un membre de la classe, donc
pas possible!!!
Ben pour resoudre ce problème, il suffit de déclarer
mutable un_pointeur_iterateur;
Et tout fonctionne pour le mieu ;-)
volatile
Ce que ça signifie formellement, je n'en sais rien. Et je doute que l'on
puisse trouver deux personnes qui disent savoir et qui soient d'accord
entre elles ;).
volatile
Ce que ça signifie formellement, je n'en sais rien. Et je doute que l'on
puisse trouver deux personnes qui disent savoir et qui soient d'accord
entre elles ;).
volatile
Ce que ça signifie formellement, je n'en sais rien. Et je doute que l'on
puisse trouver deux personnes qui disent savoir et qui soient d'accord
entre elles ;).
"drkm" a écrit dans le message news:Loïc Joly writes:volatile
Ce que ça signifie formellement, je n'en sais rien. Et je doute que l'on
puisse trouver deux personnes qui disent savoir et qui soient d'accord
entre elles ;).
7.1.5.1/8 :
[Note: volatile is a hint to the implementation to avoid
aggressive optimization involving the object because the value of
the object might be changed by means undetectable by an
implementation.
Évidemment, ça aide pas.
Je prends en route, donc, si ce texte laisse de côté une question
précise que vous auriez évoquée, je me retire sur la pointe des
pieds.
Ceci dit, veux-tu dire que le texte ci-dessus n'est pas clair ? Je le
trouve limpide, pour ma part.
"drkm" <usenet.fclcxx@fgeorges.org> a écrit dans le message news:
wk8y7pvkh7.fsf@fgeorges.org...
Loïc Joly <loic.actarus.joly@wanadoo.fr> writes:
volatile
Ce que ça signifie formellement, je n'en sais rien. Et je doute que l'on
puisse trouver deux personnes qui disent savoir et qui soient d'accord
entre elles ;).
7.1.5.1/8 :
[Note: volatile is a hint to the implementation to avoid
aggressive optimization involving the object because the value of
the object might be changed by means undetectable by an
implementation.
Évidemment, ça aide pas.
Je prends en route, donc, si ce texte laisse de côté une question
précise que vous auriez évoquée, je me retire sur la pointe des
pieds.
Ceci dit, veux-tu dire que le texte ci-dessus n'est pas clair ? Je le
trouve limpide, pour ma part.
"drkm" a écrit dans le message news:Loïc Joly writes:volatile
Ce que ça signifie formellement, je n'en sais rien. Et je doute que l'on
puisse trouver deux personnes qui disent savoir et qui soient d'accord
entre elles ;).
7.1.5.1/8 :
[Note: volatile is a hint to the implementation to avoid
aggressive optimization involving the object because the value of
the object might be changed by means undetectable by an
implementation.
Évidemment, ça aide pas.
Je prends en route, donc, si ce texte laisse de côté une question
précise que vous auriez évoquée, je me retire sur la pointe des
pieds.
Ceci dit, veux-tu dire que le texte ci-dessus n'est pas clair ? Je le
trouve limpide, pour ma part.
Stephane Wirtel wrote:Lisant parfois du code avec ces mots réservés, je me demande
maintenant quelles sont les fonctionnalités de ces deux mots.
mutable
La constance d'un objet peut être définie de façon bit à bit ou
de
façon sémentique. La définition sémentique est souvent celle
qu'on
veut. En C++, par défaut, il s'agit de la façon bit à bit, mais on
peut lui indiquer grâce à mutable que certaines données membre ne
sont
pas à prendre en compte pour la constance.
Comme Fabien, je ne m'en sert que pour optimiser, et donc uniquement
pour des données membres qui ne font pas partie de l'interface
publique de ma classe (y compris par accesseurs).
volatile
Ce que ça signifie formellement, je n'en sais rien. Et je doute que
l'on puisse trouver deux personnes qui disent savoir et qui soient
d'accord entre elles ;).
En pratique, c'est destiné, par exemple, pour de la mémoire qui
correspond à un mappage d'une carte d'extension, et qui donc peut
changer de contenu sans que le processeur soit au courant. Ca a pour
but de désactiver certaines optimisations qui ne sont plus valables
dans ce contexte. Par exemple a=b; a=b; ne pourra pas être
simplifié
en un seul a=b; si b est volatile. A part des gens écrivant des
drivers, je ne pense pas que ce soit vraiment utilisé.
Pour info, il y a des gens qui ont détourné ce mot clef, car comme
il
fait partie du système de type, ils l'utilisent pour différentier
deux
types de variables. Mais il s'agit d'un hack immonde qui n'a rien à
voir avec le vrai rôle de volatile.
Stephane Wirtel wrote:
Lisant parfois du code avec ces mots réservés, je me demande
maintenant quelles sont les fonctionnalités de ces deux mots.
mutable
La constance d'un objet peut être définie de façon bit à bit ou
de
façon sémentique. La définition sémentique est souvent celle
qu'on
veut. En C++, par défaut, il s'agit de la façon bit à bit, mais on
peut lui indiquer grâce à mutable que certaines données membre ne
sont
pas à prendre en compte pour la constance.
Comme Fabien, je ne m'en sert que pour optimiser, et donc uniquement
pour des données membres qui ne font pas partie de l'interface
publique de ma classe (y compris par accesseurs).
volatile
Ce que ça signifie formellement, je n'en sais rien. Et je doute que
l'on puisse trouver deux personnes qui disent savoir et qui soient
d'accord entre elles ;).
En pratique, c'est destiné, par exemple, pour de la mémoire qui
correspond à un mappage d'une carte d'extension, et qui donc peut
changer de contenu sans que le processeur soit au courant. Ca a pour
but de désactiver certaines optimisations qui ne sont plus valables
dans ce contexte. Par exemple a=b; a=b; ne pourra pas être
simplifié
en un seul a=b; si b est volatile. A part des gens écrivant des
drivers, je ne pense pas que ce soit vraiment utilisé.
Pour info, il y a des gens qui ont détourné ce mot clef, car comme
il
fait partie du système de type, ils l'utilisent pour différentier
deux
types de variables. Mais il s'agit d'un hack immonde qui n'a rien à
voir avec le vrai rôle de volatile.
Stephane Wirtel wrote:Lisant parfois du code avec ces mots réservés, je me demande
maintenant quelles sont les fonctionnalités de ces deux mots.
mutable
La constance d'un objet peut être définie de façon bit à bit ou
de
façon sémentique. La définition sémentique est souvent celle
qu'on
veut. En C++, par défaut, il s'agit de la façon bit à bit, mais on
peut lui indiquer grâce à mutable que certaines données membre ne
sont
pas à prendre en compte pour la constance.
Comme Fabien, je ne m'en sert que pour optimiser, et donc uniquement
pour des données membres qui ne font pas partie de l'interface
publique de ma classe (y compris par accesseurs).
volatile
Ce que ça signifie formellement, je n'en sais rien. Et je doute que
l'on puisse trouver deux personnes qui disent savoir et qui soient
d'accord entre elles ;).
En pratique, c'est destiné, par exemple, pour de la mémoire qui
correspond à un mappage d'une carte d'extension, et qui donc peut
changer de contenu sans que le processeur soit au courant. Ca a pour
but de désactiver certaines optimisations qui ne sont plus valables
dans ce contexte. Par exemple a=b; a=b; ne pourra pas être
simplifié
en un seul a=b; si b est volatile. A part des gens écrivant des
drivers, je ne pense pas que ce soit vraiment utilisé.
Pour info, il y a des gens qui ont détourné ce mot clef, car comme
il
fait partie du système de type, ils l'utilisent pour différentier
deux
types de variables. Mais il s'agit d'un hack immonde qui n'a rien à
voir avec le vrai rôle de volatile.
"Alain Naigeon" writes:"drkm" a écrit dans le message news:Loïc Joly writes:volatile
Ce que ça signifie formellement, je n'en sais rien. Et je
doute
que l'on puisse trouver deux personnes qui disent savoir et qui
soient d'accord entre elles ;).
7.1.5.1/8 :
[Note: volatile is a hint to the implementation to avoid
aggressive optimization involving the object because the
value
of the object might be changed by means undetectable by an
implementation.
Évidemment, ça aide pas.
Je prends en route, donc, si ce texte laisse de côté une question
précise que vous auriez évoquée, je me retire sur la pointe des
pieds. Ceci dit, veux-tu dire que le texte ci-dessus n'est pas
clair ? Je le trouve limpide, pour ma part.
A ma connaissance, le seul effet definit par le langage qu'a volatile
est celui de rendre valide certaines lectures apres un longjmp (et
encore, j'ai pas les normes sous la main et je me demande maintenant
si celle du C++ n'enleve pas une partie de ce que dit celle du C) et
de plus les longjmp en C++...
Pour le reste, c'est tres vague. C'est quoi une optimisation
agressive? Est-ce que deplacer une lecture avant ou une ecriture
apres
un acces a une variable volatile en est une? Ca gene l'utilisation de
variables volatile comme synchronisation. Est-ce qu'acceder a une
valeur en cache en est une? Sur certaines architectures
multi-processeurs, il faut synchroniser explicitement les caches. Ces
deux choses ne sont generalement pas traitees par volatile tel
qu'implemente par la plupart des compilateurs (en fait je n'en
connais
pas qui les traite).
A mon avis, l'utiliser pour autre chose que
- conserver des valeurs apres un longjmp (et voir ma remarque
ci-dessus)
- acceder a des IO mappees en memoire (et donc avec cache
desactive) ce pour quoi il a ete concu a la base,
c'est chercher des problemes.
En particulier toute utilisation dans du cadre du multithread ne
fonctionnera au mieux que sur des mono-processeurs ou certaines
familles de multi-processeurs mais echouera sur d'autres (l'Alpha et
les architecture NUMA en particulier).
"Alain Naigeon" <anaigeon@free.fr> writes:
"drkm" <usenet.fclcxx@fgeorges.org> a écrit dans le message news:
wk8y7pvkh7.fsf@fgeorges.org...
Loïc Joly <loic.actarus.joly@wanadoo.fr> writes:
volatile
Ce que ça signifie formellement, je n'en sais rien. Et je
doute
que l'on puisse trouver deux personnes qui disent savoir et qui
soient d'accord entre elles ;).
7.1.5.1/8 :
[Note: volatile is a hint to the implementation to avoid
aggressive optimization involving the object because the
value
of the object might be changed by means undetectable by an
implementation.
Évidemment, ça aide pas.
Je prends en route, donc, si ce texte laisse de côté une question
précise que vous auriez évoquée, je me retire sur la pointe des
pieds. Ceci dit, veux-tu dire que le texte ci-dessus n'est pas
clair ? Je le trouve limpide, pour ma part.
A ma connaissance, le seul effet definit par le langage qu'a volatile
est celui de rendre valide certaines lectures apres un longjmp (et
encore, j'ai pas les normes sous la main et je me demande maintenant
si celle du C++ n'enleve pas une partie de ce que dit celle du C) et
de plus les longjmp en C++...
Pour le reste, c'est tres vague. C'est quoi une optimisation
agressive? Est-ce que deplacer une lecture avant ou une ecriture
apres
un acces a une variable volatile en est une? Ca gene l'utilisation de
variables volatile comme synchronisation. Est-ce qu'acceder a une
valeur en cache en est une? Sur certaines architectures
multi-processeurs, il faut synchroniser explicitement les caches. Ces
deux choses ne sont generalement pas traitees par volatile tel
qu'implemente par la plupart des compilateurs (en fait je n'en
connais
pas qui les traite).
A mon avis, l'utiliser pour autre chose que
- conserver des valeurs apres un longjmp (et voir ma remarque
ci-dessus)
- acceder a des IO mappees en memoire (et donc avec cache
desactive) ce pour quoi il a ete concu a la base,
c'est chercher des problemes.
En particulier toute utilisation dans du cadre du multithread ne
fonctionnera au mieux que sur des mono-processeurs ou certaines
familles de multi-processeurs mais echouera sur d'autres (l'Alpha et
les architecture NUMA en particulier).
"Alain Naigeon" writes:"drkm" a écrit dans le message news:Loïc Joly writes:volatile
Ce que ça signifie formellement, je n'en sais rien. Et je
doute
que l'on puisse trouver deux personnes qui disent savoir et qui
soient d'accord entre elles ;).
7.1.5.1/8 :
[Note: volatile is a hint to the implementation to avoid
aggressive optimization involving the object because the
value
of the object might be changed by means undetectable by an
implementation.
Évidemment, ça aide pas.
Je prends en route, donc, si ce texte laisse de côté une question
précise que vous auriez évoquée, je me retire sur la pointe des
pieds. Ceci dit, veux-tu dire que le texte ci-dessus n'est pas
clair ? Je le trouve limpide, pour ma part.
A ma connaissance, le seul effet definit par le langage qu'a volatile
est celui de rendre valide certaines lectures apres un longjmp (et
encore, j'ai pas les normes sous la main et je me demande maintenant
si celle du C++ n'enleve pas une partie de ce que dit celle du C) et
de plus les longjmp en C++...
Pour le reste, c'est tres vague. C'est quoi une optimisation
agressive? Est-ce que deplacer une lecture avant ou une ecriture
apres
un acces a une variable volatile en est une? Ca gene l'utilisation de
variables volatile comme synchronisation. Est-ce qu'acceder a une
valeur en cache en est une? Sur certaines architectures
multi-processeurs, il faut synchroniser explicitement les caches. Ces
deux choses ne sont generalement pas traitees par volatile tel
qu'implemente par la plupart des compilateurs (en fait je n'en
connais
pas qui les traite).
A mon avis, l'utiliser pour autre chose que
- conserver des valeurs apres un longjmp (et voir ma remarque
ci-dessus)
- acceder a des IO mappees en memoire (et donc avec cache
desactive) ce pour quoi il a ete concu a la base,
c'est chercher des problemes.
En particulier toute utilisation dans du cadre du multithread ne
fonctionnera au mieux que sur des mono-processeurs ou certaines
familles de multi-processeurs mais echouera sur d'autres (l'Alpha et
les architecture NUMA en particulier).