Autrement dit
int f(int a, int b) { return a * b; }
i = 0;
k = f(i++, i++);
on sait qu'apres l'execution k vaut 0 et i 2 mais on ne sait pas si
l'appel c'est fait avec a=0 et b=1 ou bien a=1 et b=0.
Alors qu'avec
i = 0;
k = i++ * i++;
on ne peut rien dire du tout, ni sur la valeur de k ni celle de i.
Autrement dit
int f(int a, int b) { return a * b; }
i = 0;
k = f(i++, i++);
on sait qu'apres l'execution k vaut 0 et i 2 mais on ne sait pas si
l'appel c'est fait avec a=0 et b=1 ou bien a=1 et b=0.
Alors qu'avec
i = 0;
k = i++ * i++;
on ne peut rien dire du tout, ni sur la valeur de k ni celle de i.
Autrement dit
int f(int a, int b) { return a * b; }
i = 0;
k = f(i++, i++);
on sait qu'apres l'execution k vaut 0 et i 2 mais on ne sait pas si
l'appel c'est fait avec a=0 et b=1 ou bien a=1 et b=0.
Alors qu'avec
i = 0;
k = i++ * i++;
on ne peut rien dire du tout, ni sur la valeur de k ni celle de i.
En <news:,
Jean-Marc Bourguet va escriure:Autrement dit
int f(int a, int b) { return a * b; }
i = 0;
k = f(i++, i++);
on sait qu'apres l'execution k vaut 0 et i 2 mais on ne sait pas si
l'appel c'est fait avec a=0 et b=1 ou bien a=1 et b=0.
Ou même a=0 b=0.
En <news:pxbhdcq1z5u.fsf@news.bourguet.org>,
Jean-Marc Bourguet va escriure:
Autrement dit
int f(int a, int b) { return a * b; }
i = 0;
k = f(i++, i++);
on sait qu'apres l'execution k vaut 0 et i 2 mais on ne sait pas si
l'appel c'est fait avec a=0 et b=1 ou bien a=1 et b=0.
Ou même a=0 b=0.
En <news:,
Jean-Marc Bourguet va escriure:Autrement dit
int f(int a, int b) { return a * b; }
i = 0;
k = f(i++, i++);
on sait qu'apres l'execution k vaut 0 et i 2 mais on ne sait pas si
l'appel c'est fait avec a=0 et b=1 ou bien a=1 et b=0.
Ou même a=0 b=0.
"Antoine Leca" writes:En <news:,
Jean-Marc Bourguet va escriure:Autrement dit
int f(int a, int b) { return a * b; }
i = 0;
k = f(i++, i++);
on sait qu'apres l'execution k vaut 0 et i 2 mais on ne sait pas si
l'appel c'est fait avec a=0 et b=1 ou bien a=1 et b=0.
Ou même a=0 b=0.
Oops, j'ai ete voir aux sources plutot que de me baser sur ma memoire
-- ce que je devrais faire quand il s'agit de points dont je ne me
sert de toute facon pas -- et contrairement a ce que je pensais il n'y
a pas de point de sequence entre les evaluations des arguments mais
uniquement avant l'appel de la fonction.
"Antoine Leca" <root@localhost.invalid> writes:
En <news:pxbhdcq1z5u.fsf@news.bourguet.org>,
Jean-Marc Bourguet va escriure:
Autrement dit
int f(int a, int b) { return a * b; }
i = 0;
k = f(i++, i++);
on sait qu'apres l'execution k vaut 0 et i 2 mais on ne sait pas si
l'appel c'est fait avec a=0 et b=1 ou bien a=1 et b=0.
Ou même a=0 b=0.
Oops, j'ai ete voir aux sources plutot que de me baser sur ma memoire
-- ce que je devrais faire quand il s'agit de points dont je ne me
sert de toute facon pas -- et contrairement a ce que je pensais il n'y
a pas de point de sequence entre les evaluations des arguments mais
uniquement avant l'appel de la fonction.
"Antoine Leca" writes:En <news:,
Jean-Marc Bourguet va escriure:Autrement dit
int f(int a, int b) { return a * b; }
i = 0;
k = f(i++, i++);
on sait qu'apres l'execution k vaut 0 et i 2 mais on ne sait pas si
l'appel c'est fait avec a=0 et b=1 ou bien a=1 et b=0.
Ou même a=0 b=0.
Oops, j'ai ete voir aux sources plutot que de me baser sur ma memoire
-- ce que je devrais faire quand il s'agit de points dont je ne me
sert de toute facon pas -- et contrairement a ce que je pensais il n'y
a pas de point de sequence entre les evaluations des arguments mais
uniquement avant l'appel de la fonction.
"Antoine Leca" writes:En <news:,
Jean-Marc Bourguet va escriure:Autrement dit
int f(int a, int b) { return a * b; }
i = 0;
k = f(i++, i++);
on sait qu'apres l'execution k vaut 0 et i 2 mais on ne sait pas si
l'appel c'est fait avec a=0 et b=1 ou bien a=1 et b=0.
Ou même a=0 b=0.
Oops, j'ai ete voir aux sources plutot que de me baser sur ma memoire
-- ce que je devrais faire quand il s'agit de points dont je ne me
sert de toute facon pas -- et contrairement a ce que je pensais il n'y
a pas de point de sequence entre les evaluations des arguments mais
uniquement avant l'appel de la fonction.
"Antoine Leca" <root@localhost.invalid> writes:
En <news:pxbhdcq1z5u.fsf@news.bourguet.org>,
Jean-Marc Bourguet va escriure:
Autrement dit
int f(int a, int b) { return a * b; }
i = 0;
k = f(i++, i++);
on sait qu'apres l'execution k vaut 0 et i 2 mais on ne sait pas si
l'appel c'est fait avec a=0 et b=1 ou bien a=1 et b=0.
Ou même a=0 b=0.
Oops, j'ai ete voir aux sources plutot que de me baser sur ma memoire
-- ce que je devrais faire quand il s'agit de points dont je ne me
sert de toute facon pas -- et contrairement a ce que je pensais il n'y
a pas de point de sequence entre les evaluations des arguments mais
uniquement avant l'appel de la fonction.
"Antoine Leca" writes:En <news:,
Jean-Marc Bourguet va escriure:Autrement dit
int f(int a, int b) { return a * b; }
i = 0;
k = f(i++, i++);
on sait qu'apres l'execution k vaut 0 et i 2 mais on ne sait pas si
l'appel c'est fait avec a=0 et b=1 ou bien a=1 et b=0.
Ou même a=0 b=0.
Oops, j'ai ete voir aux sources plutot que de me baser sur ma memoire
-- ce que je devrais faire quand il s'agit de points dont je ne me
sert de toute facon pas -- et contrairement a ce que je pensais il n'y
a pas de point de sequence entre les evaluations des arguments mais
uniquement avant l'appel de la fonction.
En <news:, Pierre Maurette va
escriure:Je pense qu'il n'y a qu'une seule alternative: soit respecter les
conventions d'appel, soit développer la fonction inline.
Non. Les conventions d'appel ne sont pas forcément uniques, tu peux (et
généralement tu as, pour des raisons de marché et de différenciations
marketing) des extensions ou des options (#pragma) permettant de les
modifier.
De plus, si les conventions de passage sont par pile, en général cela va
créer une contrainte d'ordre partiel. Mais si les conventions utilisent les
registres, cette contrainte disparaît ; et les compilateurs actuels vont
magouiller l'expression pour espacer le plus possible les interactions avec
chaque espace de mémoire (y compris les registres), histoire de remplir tous
les pipelines parallèles.
En <news:mn.52367d59df2fc1aa.31483@laposte.net>, Pierre Maurette va
escriure:
Je pense qu'il n'y a qu'une seule alternative: soit respecter les
conventions d'appel, soit développer la fonction inline.
Non. Les conventions d'appel ne sont pas forcément uniques, tu peux (et
généralement tu as, pour des raisons de marché et de différenciations
marketing) des extensions ou des options (#pragma) permettant de les
modifier.
De plus, si les conventions de passage sont par pile, en général cela va
créer une contrainte d'ordre partiel. Mais si les conventions utilisent les
registres, cette contrainte disparaît ; et les compilateurs actuels vont
magouiller l'expression pour espacer le plus possible les interactions avec
chaque espace de mémoire (y compris les registres), histoire de remplir tous
les pipelines parallèles.
En <news:, Pierre Maurette va
escriure:Je pense qu'il n'y a qu'une seule alternative: soit respecter les
conventions d'appel, soit développer la fonction inline.
Non. Les conventions d'appel ne sont pas forcément uniques, tu peux (et
généralement tu as, pour des raisons de marché et de différenciations
marketing) des extensions ou des options (#pragma) permettant de les
modifier.
De plus, si les conventions de passage sont par pile, en général cela va
créer une contrainte d'ordre partiel. Mais si les conventions utilisent les
registres, cette contrainte disparaît ; et les compilateurs actuels vont
magouiller l'expression pour espacer le plus possible les interactions avec
chaque espace de mémoire (y compris les registres), histoire de remplir tous
les pipelines parallèles.
"Jean-Marc Bourguet" wrote in message
news:"Antoine Leca" writes:En <news:,
Jean-Marc Bourguet va escriure:Autrement dit
int f(int a, int b) { return a * b; }
i = 0;
k = f(i++, i++);
on sait qu'apres l'execution k vaut 0 et i 2 mais on ne sait pas si
l'appel c'est fait avec a=0 et b=1 ou bien a=1 et b=0.
Ou même a=0 b=0.
Oops, j'ai ete voir aux sources plutot que de me baser sur ma memoire
-- ce que je devrais faire quand il s'agit de points dont je ne me
sert de toute facon pas -- et contrairement a ce que je pensais il n'y
a pas de point de sequence entre les evaluations des arguments mais
uniquement avant l'appel de la fonction.
Exact, ce qui permet par exemple d'evaluer en parallèle sur les
architectures qui le permettent les expressions des paramètres de f.
"Jean-Marc Bourguet" <jm@bourguet.org> wrote in message
news:pxb8xy21qk8.fsf@news.bourguet.org...
"Antoine Leca" <root@localhost.invalid> writes:
En <news:pxbhdcq1z5u.fsf@news.bourguet.org>,
Jean-Marc Bourguet va escriure:
Autrement dit
int f(int a, int b) { return a * b; }
i = 0;
k = f(i++, i++);
on sait qu'apres l'execution k vaut 0 et i 2 mais on ne sait pas si
l'appel c'est fait avec a=0 et b=1 ou bien a=1 et b=0.
Ou même a=0 b=0.
Oops, j'ai ete voir aux sources plutot que de me baser sur ma memoire
-- ce que je devrais faire quand il s'agit de points dont je ne me
sert de toute facon pas -- et contrairement a ce que je pensais il n'y
a pas de point de sequence entre les evaluations des arguments mais
uniquement avant l'appel de la fonction.
Exact, ce qui permet par exemple d'evaluer en parallèle sur les
architectures qui le permettent les expressions des paramètres de f.
"Jean-Marc Bourguet" wrote in message
news:"Antoine Leca" writes:En <news:,
Jean-Marc Bourguet va escriure:Autrement dit
int f(int a, int b) { return a * b; }
i = 0;
k = f(i++, i++);
on sait qu'apres l'execution k vaut 0 et i 2 mais on ne sait pas si
l'appel c'est fait avec a=0 et b=1 ou bien a=1 et b=0.
Ou même a=0 b=0.
Oops, j'ai ete voir aux sources plutot que de me baser sur ma memoire
-- ce que je devrais faire quand il s'agit de points dont je ne me
sert de toute facon pas -- et contrairement a ce que je pensais il n'y
a pas de point de sequence entre les evaluations des arguments mais
uniquement avant l'appel de la fonction.
Exact, ce qui permet par exemple d'evaluer en parallèle sur les
architectures qui le permettent les expressions des paramètres de f.
Ce n'est permis evidemment que quand ces parametres sont des
expressions sans appels de fonction, sinon il y a quelques points de
sequencement en plus
(mais leur ordre relatif n'est pas fixe).
Pour reprendre mon exemple:
int incr(int* i) {
return (*i)++;
}
i = 0;
k = f(incr(i), incr(i));
ici on est sur que l'appel a f se fait avec a=0 et b=1 ou a=1 et b=0.
(Ou alors il y a autre chose qui m'echappe).
Plus subtil, est-ce que
k = f(incr(i), i++);
a les memes garanties?
Naturellement, je laisse
int j = 0;
incr(int*i) { j++; return (*i)++;}
k = f(incr(i), i++ + j++);
a ceux qui veulent reellement s'amuser.
Une chose qui m'echappe c'est un exemple realiste ou ca apporte un
gain et ou la regle du "as-if" ne permet pas le meme gain.
Ce n'est permis evidemment que quand ces parametres sont des
expressions sans appels de fonction, sinon il y a quelques points de
sequencement en plus
(mais leur ordre relatif n'est pas fixe).
Pour reprendre mon exemple:
int incr(int* i) {
return (*i)++;
}
i = 0;
k = f(incr(i), incr(i));
ici on est sur que l'appel a f se fait avec a=0 et b=1 ou a=1 et b=0.
(Ou alors il y a autre chose qui m'echappe).
Plus subtil, est-ce que
k = f(incr(i), i++);
a les memes garanties?
Naturellement, je laisse
int j = 0;
incr(int*i) { j++; return (*i)++;}
k = f(incr(i), i++ + j++);
a ceux qui veulent reellement s'amuser.
Une chose qui m'echappe c'est un exemple realiste ou ca apporte un
gain et ou la regle du "as-if" ne permet pas le meme gain.
Ce n'est permis evidemment que quand ces parametres sont des
expressions sans appels de fonction, sinon il y a quelques points de
sequencement en plus
(mais leur ordre relatif n'est pas fixe).
Pour reprendre mon exemple:
int incr(int* i) {
return (*i)++;
}
i = 0;
k = f(incr(i), incr(i));
ici on est sur que l'appel a f se fait avec a=0 et b=1 ou a=1 et b=0.
(Ou alors il y a autre chose qui m'echappe).
Plus subtil, est-ce que
k = f(incr(i), i++);
a les memes garanties?
Naturellement, je laisse
int j = 0;
incr(int*i) { j++; return (*i)++;}
k = f(incr(i), i++ + j++);
a ceux qui veulent reellement s'amuser.
Une chose qui m'echappe c'est un exemple realiste ou ca apporte un
gain et ou la regle du "as-if" ne permet pas le meme gain.
"Antoine Leca" wrote in message
news:dg3hhd$kuf$En <news:, Pierre Maurette va
escriure:Je pense qu'il n'y a qu'une seule alternative: soit respecter les
conventions d'appel, soit développer la fonction inline.
[...] si les conventions de passage sont par pile, en général
cela va créer une contrainte d'ordre partiel.
Ne mélange pas les conventions d'appel et l'ordre d'évaluation des
paramètres, ceux-ci peuvent être évalués dans n'importe quel ordre,
voire de facon concommitante et les résultats sont ensuite mis sur la
pile dans le bon ordre pour respecter la convention d'appel.
"Antoine Leca" <root@localhost.invalid> wrote in message
news:dg3hhd$kuf$1@shakotay.alphanet.ch...
En <news:mn.52367d59df2fc1aa.31483@laposte.net>, Pierre Maurette va
escriure:
Je pense qu'il n'y a qu'une seule alternative: soit respecter les
conventions d'appel, soit développer la fonction inline.
[...] si les conventions de passage sont par pile, en général
cela va créer une contrainte d'ordre partiel.
Ne mélange pas les conventions d'appel et l'ordre d'évaluation des
paramètres, ceux-ci peuvent être évalués dans n'importe quel ordre,
voire de facon concommitante et les résultats sont ensuite mis sur la
pile dans le bon ordre pour respecter la convention d'appel.
"Antoine Leca" wrote in message
news:dg3hhd$kuf$En <news:, Pierre Maurette va
escriure:Je pense qu'il n'y a qu'une seule alternative: soit respecter les
conventions d'appel, soit développer la fonction inline.
[...] si les conventions de passage sont par pile, en général
cela va créer une contrainte d'ordre partiel.
Ne mélange pas les conventions d'appel et l'ordre d'évaluation des
paramètres, ceux-ci peuvent être évalués dans n'importe quel ordre,
voire de facon concommitante et les résultats sont ensuite mis sur la
pile dans le bon ordre pour respecter la convention d'appel.
"Charlie Gordon" writes:Exact, ce qui permet par exemple d'evaluer en parallèle sur les
architectures qui le permettent les expressions des paramètres de f.
Ce n'est permis evidemment que quand ces parametres sont des
expressions sans appels de fonction, sinon il y a quelques points de
sequencement en plus (mais leur ordre relatif n'est pas fixe). Pour
reprendre mon exemple:
int incr(int* i) {
return (*i)++;
}
i = 0;
k = f(incr(i), incr(i));
ici on est sur que l'appel a f se fait avec a=0 et b=1 ou a=1 et b=0.
(Ou alors il y a autre chose qui m'echappe).
Plus subtil, est-ce que
k = f(incr(i), i++);
a les memes garanties? (Pas le temps de faire un exegese pour essayer
d'apporter une reponse).
Naturellement, je laisse
int j = 0;
incr(int*i) { j++; return (*i)++;}
k = f(incr(i), i++ + j++);
a ceux qui veulent reellement s'amuser.
Une chose qui m'echappe c'est un exemple realiste ou ca apporte un
gain et ou la regle du "as-if" ne permet pas le meme gain. Il faut
avouer que j'ai le meme probleme pour l'ordre d'evaluation des
parametres (si j'admets que ca simplifie un peu le compilateur, je ne
percois pas de gain en performance).
"Charlie Gordon" <news@chqrlie.org> writes:
Exact, ce qui permet par exemple d'evaluer en parallèle sur les
architectures qui le permettent les expressions des paramètres de f.
Ce n'est permis evidemment que quand ces parametres sont des
expressions sans appels de fonction, sinon il y a quelques points de
sequencement en plus (mais leur ordre relatif n'est pas fixe). Pour
reprendre mon exemple:
int incr(int* i) {
return (*i)++;
}
i = 0;
k = f(incr(i), incr(i));
ici on est sur que l'appel a f se fait avec a=0 et b=1 ou a=1 et b=0.
(Ou alors il y a autre chose qui m'echappe).
Plus subtil, est-ce que
k = f(incr(i), i++);
a les memes garanties? (Pas le temps de faire un exegese pour essayer
d'apporter une reponse).
Naturellement, je laisse
int j = 0;
incr(int*i) { j++; return (*i)++;}
k = f(incr(i), i++ + j++);
a ceux qui veulent reellement s'amuser.
Une chose qui m'echappe c'est un exemple realiste ou ca apporte un
gain et ou la regle du "as-if" ne permet pas le meme gain. Il faut
avouer que j'ai le meme probleme pour l'ordre d'evaluation des
parametres (si j'admets que ca simplifie un peu le compilateur, je ne
percois pas de gain en performance).
"Charlie Gordon" writes:Exact, ce qui permet par exemple d'evaluer en parallèle sur les
architectures qui le permettent les expressions des paramètres de f.
Ce n'est permis evidemment que quand ces parametres sont des
expressions sans appels de fonction, sinon il y a quelques points de
sequencement en plus (mais leur ordre relatif n'est pas fixe). Pour
reprendre mon exemple:
int incr(int* i) {
return (*i)++;
}
i = 0;
k = f(incr(i), incr(i));
ici on est sur que l'appel a f se fait avec a=0 et b=1 ou a=1 et b=0.
(Ou alors il y a autre chose qui m'echappe).
Plus subtil, est-ce que
k = f(incr(i), i++);
a les memes garanties? (Pas le temps de faire un exegese pour essayer
d'apporter une reponse).
Naturellement, je laisse
int j = 0;
incr(int*i) { j++; return (*i)++;}
k = f(incr(i), i++ + j++);
a ceux qui veulent reellement s'amuser.
Une chose qui m'echappe c'est un exemple realiste ou ca apporte un
gain et ou la regle du "as-if" ne permet pas le meme gain. Il faut
avouer que j'ai le meme probleme pour l'ordre d'evaluation des
parametres (si j'admets que ca simplifie un peu le compilateur, je ne
percois pas de gain en performance).