Dans tous les contextes ou c'est observable,
les expressions entieres
constantes doivent se comporter comme si elles etaient evaluees a la
compilation
(en particulier, elles peuvent apparaitre comme taille de
tableaux en C90).
En pratique, la mecanique pour faire ces calculs a la
compilation doivent donc etre la car ne pas les avoir *compliquerait*
l'implementation.
Si tu as un compilateur pour lequel c'est un probleme de performance, le
Dans tous les contextes ou c'est observable,
les expressions entieres
constantes doivent se comporter comme si elles etaient evaluees a la
compilation
(en particulier, elles peuvent apparaitre comme taille de
tableaux en C90).
En pratique, la mecanique pour faire ces calculs a la
compilation doivent donc etre la car ne pas les avoir *compliquerait*
l'implementation.
Si tu as un compilateur pour lequel c'est un probleme de performance, le
Dans tous les contextes ou c'est observable,
les expressions entieres
constantes doivent se comporter comme si elles etaient evaluees a la
compilation
(en particulier, elles peuvent apparaitre comme taille de
tableaux en C90).
En pratique, la mecanique pour faire ces calculs a la
compilation doivent donc etre la car ne pas les avoir *compliquerait*
l'implementation.
Si tu as un compilateur pour lequel c'est un probleme de performance, le
Marc Boyer a écrit :Mais la norme ne te garantie pas non plus que le compilo ne fera pas
calculer au processeur les statistiques du dernier tierce entre
chaque intruction, ou qu'il utilisera bien l'instruction de multiplication
du processeur et ne calculera pas les multiplications par sommes successives.
Oui, c'est l'argument qu'a déjà donné Antoine mais qui n'est pas probant
dans la mesure où je n'ai aucun contrôle sur ce type de comportement
fantasque du compilateur. Par contre, en utilisant BORNE dans de
nombreuses boucles imbriquées
#define BORNE (BASE*BASE*BASE*BASE)
je prends le risque de faire faire au processeur de nombreux calculs
inutiles pendant l'exécution.
Pourquoi ne le faits-tu pas ? A ton avis, quel est le risque majeur
de l'informatique des années 2000 ? Avoir un code non maintenable ou
avoir un code qui rame ?
Je ne vois pas le rapport avec notre problème. Tu veux dire que sous
prétexte que les processeurs sont rapides aujourd'hui, on peut se
permettre de faire l'impasse sur certaines optimisations basiques ?
Je
ne suis pas compétent pour répondre ayant une vue très étroite de
l'informatique des années 2000 mais j qu'on a besoin dans certaines
circonstances de code qui soit bien optimisé. Par ailleurs, je ne vois
pas pourquoi tu opposes rapidité et maintenabilité.
Pour une question de lisibilité, tu penses bien que je préfèrerais écrire
#define BASE 10
#define BORNE (BASE*BASE*BASE*BASE)
Le compilo pourrait même la calculer 3*(3*n) fois, c'est à dire la
calculer 3 fois chaque fois qu'il en a besoin, et vérifier que
les 3 valeurs sont les mêmes, et sinon, choisir par un vote.
Mais bien sûr. Et tu vas peut-être me dire qu'il est vain de sortir par
temps de pluie avec un parapluie rouge car Eole pourrait décider de
faire subir un effet de lévitation mortelle aux porteurs de tels parapluies.
Ce que tu racontes là est assez invraisemblable. Par contre, que le
processeur soit amené à calculer n fois le produit et cela de façon
totalement inutile me le paraît moins.
Marc Boyer a écrit :
Mais la norme ne te garantie pas non plus que le compilo ne fera pas
calculer au processeur les statistiques du dernier tierce entre
chaque intruction, ou qu'il utilisera bien l'instruction de multiplication
du processeur et ne calculera pas les multiplications par sommes successives.
Oui, c'est l'argument qu'a déjà donné Antoine mais qui n'est pas probant
dans la mesure où je n'ai aucun contrôle sur ce type de comportement
fantasque du compilateur. Par contre, en utilisant BORNE dans de
nombreuses boucles imbriquées
#define BORNE (BASE*BASE*BASE*BASE)
je prends le risque de faire faire au processeur de nombreux calculs
inutiles pendant l'exécution.
Pourquoi ne le faits-tu pas ? A ton avis, quel est le risque majeur
de l'informatique des années 2000 ? Avoir un code non maintenable ou
avoir un code qui rame ?
Je ne vois pas le rapport avec notre problème. Tu veux dire que sous
prétexte que les processeurs sont rapides aujourd'hui, on peut se
permettre de faire l'impasse sur certaines optimisations basiques ?
Je
ne suis pas compétent pour répondre ayant une vue très étroite de
l'informatique des années 2000 mais j qu'on a besoin dans certaines
circonstances de code qui soit bien optimisé. Par ailleurs, je ne vois
pas pourquoi tu opposes rapidité et maintenabilité.
Pour une question de lisibilité, tu penses bien que je préfèrerais écrire
#define BASE 10
#define BORNE (BASE*BASE*BASE*BASE)
Le compilo pourrait même la calculer 3*(3*n) fois, c'est à dire la
calculer 3 fois chaque fois qu'il en a besoin, et vérifier que
les 3 valeurs sont les mêmes, et sinon, choisir par un vote.
Mais bien sûr. Et tu vas peut-être me dire qu'il est vain de sortir par
temps de pluie avec un parapluie rouge car Eole pourrait décider de
faire subir un effet de lévitation mortelle aux porteurs de tels parapluies.
Ce que tu racontes là est assez invraisemblable. Par contre, que le
processeur soit amené à calculer n fois le produit et cela de façon
totalement inutile me le paraît moins.
Marc Boyer a écrit :Mais la norme ne te garantie pas non plus que le compilo ne fera pas
calculer au processeur les statistiques du dernier tierce entre
chaque intruction, ou qu'il utilisera bien l'instruction de multiplication
du processeur et ne calculera pas les multiplications par sommes successives.
Oui, c'est l'argument qu'a déjà donné Antoine mais qui n'est pas probant
dans la mesure où je n'ai aucun contrôle sur ce type de comportement
fantasque du compilateur. Par contre, en utilisant BORNE dans de
nombreuses boucles imbriquées
#define BORNE (BASE*BASE*BASE*BASE)
je prends le risque de faire faire au processeur de nombreux calculs
inutiles pendant l'exécution.
Pourquoi ne le faits-tu pas ? A ton avis, quel est le risque majeur
de l'informatique des années 2000 ? Avoir un code non maintenable ou
avoir un code qui rame ?
Je ne vois pas le rapport avec notre problème. Tu veux dire que sous
prétexte que les processeurs sont rapides aujourd'hui, on peut se
permettre de faire l'impasse sur certaines optimisations basiques ?
Je
ne suis pas compétent pour répondre ayant une vue très étroite de
l'informatique des années 2000 mais j qu'on a besoin dans certaines
circonstances de code qui soit bien optimisé. Par ailleurs, je ne vois
pas pourquoi tu opposes rapidité et maintenabilité.
Pour une question de lisibilité, tu penses bien que je préfèrerais écrire
#define BASE 10
#define BORNE (BASE*BASE*BASE*BASE)
Le compilo pourrait même la calculer 3*(3*n) fois, c'est à dire la
calculer 3 fois chaque fois qu'il en a besoin, et vérifier que
les 3 valeurs sont les mêmes, et sinon, choisir par un vote.
Mais bien sûr. Et tu vas peut-être me dire qu'il est vain de sortir par
temps de pluie avec un parapluie rouge car Eole pourrait décider de
faire subir un effet de lévitation mortelle aux porteurs de tels parapluies.
Ce que tu racontes là est assez invraisemblable. Par contre, que le
processeur soit amené à calculer n fois le produit et cela de façon
totalement inutile me le paraît moins.
Si tu as un compilateur pour lequel c'est un probleme de performance, le
Comment savoir si les constantes sont évaluées à la compilation ?
Si tu as un compilateur pour lequel c'est un probleme de performance, le
Comment savoir si les constantes sont évaluées à la compilation ?
Si tu as un compilateur pour lequel c'est un probleme de performance, le
Comment savoir si les constantes sont évaluées à la compilation ?
On 2008-11-18, candide wrote:Si tu as un compilateur pour lequel c'est un probleme de performance, le
Comment savoir si les constantes sont évaluées à la compilation ?
Tu regardes l'assembleur généré.
On 2008-11-18, candide <candide@free.invalid> wrote:
Si tu as un compilateur pour lequel c'est un probleme de performance, le
Comment savoir si les constantes sont évaluées à la compilation ?
Tu regardes l'assembleur généré.
On 2008-11-18, candide wrote:Si tu as un compilateur pour lequel c'est un probleme de performance, le
Comment savoir si les constantes sont évaluées à la compilation ?
Tu regardes l'assembleur généré.
Marc Boyer a écrit :On 2008-11-18, candide wrote:Si tu as un compilateur pour lequel c'est un probleme de performance, le
Comment savoir si les constantes sont évaluées à la compilation ?
Tu regardes l'assembleur généré.
Comme quoi pour faire du C convenable, il faut avoir un background
beaucoup plus large. Je sais pas si tu te rends comptes : pour répondre
à une question aussi naturelle que celle que j'ai posée, il faut
apprendre un assembleur.
En plus, tu le sauras juste sur une cible. Et qu'est-ce qui prouve que
s'il évalue ici, il évaluera encore là ?
Je vais peut-être dire une grosse c****** mais serait-il possible que le
compilateur ne soit pas capable d'effectuer l'évaluation mais que
l'environnement d'exécution lui en soit capable ?
Sinon, tu crois pas que ce serait quand même plus simple si le
compilateur documentait l'évaluation / non évaluation ? La doc, encore
la doc, toujours la doc ...
Marc Boyer a écrit :
On 2008-11-18, candide <candide@free.invalid> wrote:
Si tu as un compilateur pour lequel c'est un probleme de performance, le
Comment savoir si les constantes sont évaluées à la compilation ?
Tu regardes l'assembleur généré.
Comme quoi pour faire du C convenable, il faut avoir un background
beaucoup plus large. Je sais pas si tu te rends comptes : pour répondre
à une question aussi naturelle que celle que j'ai posée, il faut
apprendre un assembleur.
En plus, tu le sauras juste sur une cible. Et qu'est-ce qui prouve que
s'il évalue ici, il évaluera encore là ?
Je vais peut-être dire une grosse c****** mais serait-il possible que le
compilateur ne soit pas capable d'effectuer l'évaluation mais que
l'environnement d'exécution lui en soit capable ?
Sinon, tu crois pas que ce serait quand même plus simple si le
compilateur documentait l'évaluation / non évaluation ? La doc, encore
la doc, toujours la doc ...
Marc Boyer a écrit :On 2008-11-18, candide wrote:Si tu as un compilateur pour lequel c'est un probleme de performance, le
Comment savoir si les constantes sont évaluées à la compilation ?
Tu regardes l'assembleur généré.
Comme quoi pour faire du C convenable, il faut avoir un background
beaucoup plus large. Je sais pas si tu te rends comptes : pour répondre
à une question aussi naturelle que celle que j'ai posée, il faut
apprendre un assembleur.
En plus, tu le sauras juste sur une cible. Et qu'est-ce qui prouve que
s'il évalue ici, il évaluera encore là ?
Je vais peut-être dire une grosse c****** mais serait-il possible que le
compilateur ne soit pas capable d'effectuer l'évaluation mais que
l'environnement d'exécution lui en soit capable ?
Sinon, tu crois pas que ce serait quand même plus simple si le
compilateur documentait l'évaluation / non évaluation ? La doc, encore
la doc, toujours la doc ...
Comment savoir si les constantes sont évaluées à la compilation ?
Et pourquoi te restreins-tu aux expressions _entières_ ?
Par exemple, que fait gcc ?
Comment savoir si les constantes sont évaluées à la compilation ?
Et pourquoi te restreins-tu aux expressions _entières_ ?
Par exemple, que fait gcc ?
Comment savoir si les constantes sont évaluées à la compilation ?
Et pourquoi te restreins-tu aux expressions _entières_ ?
Par exemple, que fait gcc ?
Marc Boyer a écrit :On 2008-11-18, candide wrote:Si tu as un compilateur pour lequel c'est un probleme de performance, le
Comment savoir si les constantes sont évaluées à la compilation ?
Tu regardes l'assembleur généré.
Comme quoi pour faire du C convenable, il faut avoir un background
beaucoup plus large.
Je sais pas si tu te rends comptes : pour répondre
à une question aussi naturelle que celle que j'ai posée, il faut
apprendre un assembleur.
En plus, tu le sauras juste sur une cible. Et qu'est-ce qui prouve que
s'il évalue ici, il évaluera encore là ?
Je vais peut-être dire une grosse c****** mais serait-il possible que le
compilateur ne soit pas capable d'effectuer l'évaluation mais que
l'environnement d'exécution lui en soit capable ?
Sinon, tu crois pas que ce serait quand même plus simple si le
compilateur documentait l'évaluation / non évaluation ? La doc, encore
la doc, toujours la doc ...
Marc Boyer a écrit :
On 2008-11-18, candide <candide@free.invalid> wrote:
Si tu as un compilateur pour lequel c'est un probleme de performance, le
Comment savoir si les constantes sont évaluées à la compilation ?
Tu regardes l'assembleur généré.
Comme quoi pour faire du C convenable, il faut avoir un background
beaucoup plus large.
Je sais pas si tu te rends comptes : pour répondre
à une question aussi naturelle que celle que j'ai posée, il faut
apprendre un assembleur.
En plus, tu le sauras juste sur une cible. Et qu'est-ce qui prouve que
s'il évalue ici, il évaluera encore là ?
Je vais peut-être dire une grosse c****** mais serait-il possible que le
compilateur ne soit pas capable d'effectuer l'évaluation mais que
l'environnement d'exécution lui en soit capable ?
Sinon, tu crois pas que ce serait quand même plus simple si le
compilateur documentait l'évaluation / non évaluation ? La doc, encore
la doc, toujours la doc ...
Marc Boyer a écrit :On 2008-11-18, candide wrote:Si tu as un compilateur pour lequel c'est un probleme de performance, le
Comment savoir si les constantes sont évaluées à la compilation ?
Tu regardes l'assembleur généré.
Comme quoi pour faire du C convenable, il faut avoir un background
beaucoup plus large.
Je sais pas si tu te rends comptes : pour répondre
à une question aussi naturelle que celle que j'ai posée, il faut
apprendre un assembleur.
En plus, tu le sauras juste sur une cible. Et qu'est-ce qui prouve que
s'il évalue ici, il évaluera encore là ?
Je vais peut-être dire une grosse c****** mais serait-il possible que le
compilateur ne soit pas capable d'effectuer l'évaluation mais que
l'environnement d'exécution lui en soit capable ?
Sinon, tu crois pas que ce serait quand même plus simple si le
compilateur documentait l'évaluation / non évaluation ? La doc, encore
la doc, toujours la doc ...
Oui et non.
Dans le cas où n provient d'une entrée utilisateur, le compilo ne
peut pas l'évaluer, car il ne connait pas la valeur. Mais il sait
transformer ton code
for(int i=0 ; i < 3*n ; i+= 3){
...
}
en
const int n3 = 3*n;
for(int i=0 ; i < n3 ; i+= 3){
....
}
Oui et non.
Dans le cas où n provient d'une entrée utilisateur, le compilo ne
peut pas l'évaluer, car il ne connait pas la valeur. Mais il sait
transformer ton code
for(int i=0 ; i < 3*n ; i+= 3){
...
}
en
const int n3 = 3*n;
for(int i=0 ; i < n3 ; i+= 3){
....
}
Oui et non.
Dans le cas où n provient d'une entrée utilisateur, le compilo ne
peut pas l'évaluer, car il ne connait pas la valeur. Mais il sait
transformer ton code
for(int i=0 ; i < 3*n ; i+= 3){
...
}
en
const int n3 = 3*n;
for(int i=0 ; i < n3 ; i+= 3){
....
}
Marc Boyer a écrit :
> On 2008-11-18, candide wrote:
>>> Si tu as un compilateur pour lequel c'est un probleme de performance, le
>> Comment savoir si les constantes sont évaluées à la compilation ?
>
> Tu regardes l'assembleur généré.
Comme quoi pour faire du C convenable, il faut avoir un background
beaucoup plus large.
Je sais pas si tu te rends comptes : pour répondre à une question aussi
naturelle que celle que j'ai posée, il faut apprendre un assembleur.
Je vais peut-être dire une grosse c****** mais serait-il possible que le
compilateur ne soit pas capable d'effectuer l'évaluation mais que
l'environnement d'exécution lui en soit capable ?
Sinon, tu crois pas que ce serait quand même plus simple si le
compilateur documentait l'évaluation / non évaluation ?
Marc Boyer a écrit :
> On 2008-11-18, candide <candide@free.invalid> wrote:
>>> Si tu as un compilateur pour lequel c'est un probleme de performance, le
>> Comment savoir si les constantes sont évaluées à la compilation ?
>
> Tu regardes l'assembleur généré.
Comme quoi pour faire du C convenable, il faut avoir un background
beaucoup plus large.
Je sais pas si tu te rends comptes : pour répondre à une question aussi
naturelle que celle que j'ai posée, il faut apprendre un assembleur.
Je vais peut-être dire une grosse c****** mais serait-il possible que le
compilateur ne soit pas capable d'effectuer l'évaluation mais que
l'environnement d'exécution lui en soit capable ?
Sinon, tu crois pas que ce serait quand même plus simple si le
compilateur documentait l'évaluation / non évaluation ?
Marc Boyer a écrit :
> On 2008-11-18, candide wrote:
>>> Si tu as un compilateur pour lequel c'est un probleme de performance, le
>> Comment savoir si les constantes sont évaluées à la compilation ?
>
> Tu regardes l'assembleur généré.
Comme quoi pour faire du C convenable, il faut avoir un background
beaucoup plus large.
Je sais pas si tu te rends comptes : pour répondre à une question aussi
naturelle que celle que j'ai posée, il faut apprendre un assembleur.
Je vais peut-être dire une grosse c****** mais serait-il possible que le
compilateur ne soit pas capable d'effectuer l'évaluation mais que
l'environnement d'exécution lui en soit capable ?
Sinon, tu crois pas que ce serait quand même plus simple si le
compilateur documentait l'évaluation / non évaluation ?
Marc Boyer écrivait :
Oui et non.
Dans le cas où n provient d'une entrée utilisateur, le compilo ne
peut pas l'évaluer, car il ne connait pas la valeur. Mais il sait
transformer ton code
for(int i=0 ; i < 3*n ; i+= 3){
...
}
en
const int n3 = 3*n;
for(int i=0 ; i < n3 ; i+= 3){
....
}
Attention cette optimisation n'est pas valide si on change la valeur de
n dans le corps de la boucle. (Ou alors je me trompe et c'est cette
modification qui provoque un UB ?)
Marc Boyer <Marc.Boyer@cert.onera.fr.invalid> écrivait :
Oui et non.
Dans le cas où n provient d'une entrée utilisateur, le compilo ne
peut pas l'évaluer, car il ne connait pas la valeur. Mais il sait
transformer ton code
for(int i=0 ; i < 3*n ; i+= 3){
...
}
en
const int n3 = 3*n;
for(int i=0 ; i < n3 ; i+= 3){
....
}
Attention cette optimisation n'est pas valide si on change la valeur de
n dans le corps de la boucle. (Ou alors je me trompe et c'est cette
modification qui provoque un UB ?)
Marc Boyer écrivait :
Oui et non.
Dans le cas où n provient d'une entrée utilisateur, le compilo ne
peut pas l'évaluer, car il ne connait pas la valeur. Mais il sait
transformer ton code
for(int i=0 ; i < 3*n ; i+= 3){
...
}
en
const int n3 = 3*n;
for(int i=0 ; i < n3 ; i+= 3){
....
}
Attention cette optimisation n'est pas valide si on change la valeur de
n dans le corps de la boucle. (Ou alors je me trompe et c'est cette
modification qui provoque un UB ?)