Bonjour à tous.
Je vais peut-être poser une question bête, mais voici :
Je vois bien l'intérêt de déclarer const un tel argument
(programmation défensive = préférer les erreurs de compilations aux
erreurs à l'exécution, dont chacun sait qu'elles sont toujours lieu
en présence de M. Demesmaeker).
A l'inverse, je ne comprends pas en quoi cette déclaration const peut
gêner. Autrement dit : qu'est-ce qui justifie de telles réticences
face à ce genre de déclarations ?
Bonjour à tous.
Je vais peut-être poser une question bête, mais voici :
Je vois bien l'intérêt de déclarer const un tel argument
(programmation défensive = préférer les erreurs de compilations aux
erreurs à l'exécution, dont chacun sait qu'elles sont toujours lieu
en présence de M. Demesmaeker).
A l'inverse, je ne comprends pas en quoi cette déclaration const peut
gêner. Autrement dit : qu'est-ce qui justifie de telles réticences
face à ce genre de déclarations ?
Bonjour à tous.
Je vais peut-être poser une question bête, mais voici :
Je vois bien l'intérêt de déclarer const un tel argument
(programmation défensive = préférer les erreurs de compilations aux
erreurs à l'exécution, dont chacun sait qu'elles sont toujours lieu
en présence de M. Demesmaeker).
A l'inverse, je ne comprends pas en quoi cette déclaration const peut
gêner. Autrement dit : qu'est-ce qui justifie de telles réticences
face à ce genre de déclarations ?
(et se coder directement (x << 1))
Sur ?
j'ai du mal à imaginer ce qui pourrait en faire douter.
ici le type retour a la même taille que l'argument donc le meilleur codage
(si on se soucie des perfs); une fonction long Double(int) devrait elle
être codée { return 2L * x; } pour éviter l'overflow (si "int" n'a pas la
taille de "long").
oui, mais x<<1 ne se lit pas "facilement" comme le double de x (alors que
(et se coder directement (x << 1))
Sur ?
j'ai du mal à imaginer ce qui pourrait en faire douter.
ici le type retour a la même taille que l'argument donc le meilleur codage
(si on se soucie des perfs); une fonction long Double(int) devrait elle
être codée { return 2L * x; } pour éviter l'overflow (si "int" n'a pas la
taille de "long").
oui, mais x<<1 ne se lit pas "facilement" comme le double de x (alors que
(et se coder directement (x << 1))
Sur ?
j'ai du mal à imaginer ce qui pourrait en faire douter.
ici le type retour a la même taille que l'argument donc le meilleur codage
(si on se soucie des perfs); une fonction long Double(int) devrait elle
être codée { return 2L * x; } pour éviter l'overflow (si "int" n'a pas la
taille de "long").
oui, mais x<<1 ne se lit pas "facilement" comme le double de x (alors que
oui, mais x<<1 ne se lit pas "facilement" comme le double de x (alors que
2*x...)
niveau performances, rien ne te permet (comme le post de james kanze te le
dit) que x<<1 est plus rapide que 2*x. Sur un 8086, certes ;-) mais sur un
cpu moderne...
pour faire x<<1 il faudra un cycle d'horloge
pour faire 2*x également
mais si plusieurs unités entières travaillent en même temps
(les cpu modernes sont souvent superscalaires) on peut, en valeur
moyenne, descendre sous la durée d'un microcycle...
Et encore, l'optimisation devrait être faite par le compilateur plutôt que
par le programmeur ici (sauf si tu programmes pour un microcontroleur avec
un compilo C qui n'optimise pas trop mais je pense qu'on s'éloigne du
sujet)...
Sur mon système (Athlon XP) avec mon compilo (borland bcc55) le
code 2*x est compilé avec l'instruction SHL (décalage à gauche) de même que
x<<1... Le compilo a décidé (et je pense que sur cette plate-forme précise
il n'a pas tort) de l'optimisation...
Quoi qu'il en soit, la différence de vitesse AMA ne vaut pas de perdre la
lisibilité du code
oui, mais x<<1 ne se lit pas "facilement" comme le double de x (alors que
2*x...)
niveau performances, rien ne te permet (comme le post de james kanze te le
dit) que x<<1 est plus rapide que 2*x. Sur un 8086, certes ;-) mais sur un
cpu moderne...
pour faire x<<1 il faudra un cycle d'horloge
pour faire 2*x également
mais si plusieurs unités entières travaillent en même temps
(les cpu modernes sont souvent superscalaires) on peut, en valeur
moyenne, descendre sous la durée d'un microcycle...
Et encore, l'optimisation devrait être faite par le compilateur plutôt que
par le programmeur ici (sauf si tu programmes pour un microcontroleur avec
un compilo C qui n'optimise pas trop mais je pense qu'on s'éloigne du
sujet)...
Sur mon système (Athlon XP) avec mon compilo (borland bcc55) le
code 2*x est compilé avec l'instruction SHL (décalage à gauche) de même que
x<<1... Le compilo a décidé (et je pense que sur cette plate-forme précise
il n'a pas tort) de l'optimisation...
Quoi qu'il en soit, la différence de vitesse AMA ne vaut pas de perdre la
lisibilité du code
oui, mais x<<1 ne se lit pas "facilement" comme le double de x (alors que
2*x...)
niveau performances, rien ne te permet (comme le post de james kanze te le
dit) que x<<1 est plus rapide que 2*x. Sur un 8086, certes ;-) mais sur un
cpu moderne...
pour faire x<<1 il faudra un cycle d'horloge
pour faire 2*x également
mais si plusieurs unités entières travaillent en même temps
(les cpu modernes sont souvent superscalaires) on peut, en valeur
moyenne, descendre sous la durée d'un microcycle...
Et encore, l'optimisation devrait être faite par le compilateur plutôt que
par le programmeur ici (sauf si tu programmes pour un microcontroleur avec
un compilo C qui n'optimise pas trop mais je pense qu'on s'éloigne du
sujet)...
Sur mon système (Athlon XP) avec mon compilo (borland bcc55) le
code 2*x est compilé avec l'instruction SHL (décalage à gauche) de même que
x<<1... Le compilo a décidé (et je pense que sur cette plate-forme précise
il n'a pas tort) de l'optimisation...
Quoi qu'il en soit, la différence de vitesse AMA ne vaut pas de perdre la
lisibilité du code
(et se coder directement (x << 1))
Tu as de mesures à l'appui, j'espère, si tu parles de la
performance. Une application où une telle obfuscation faisait la
différence entre une performance acceptable et une performance
non-acceptable.
(et se coder directement (x << 1))
Tu as de mesures à l'appui, j'espère, si tu parles de la
performance. Une application où une telle obfuscation faisait la
différence entre une performance acceptable et une performance
non-acceptable.
(et se coder directement (x << 1))
Tu as de mesures à l'appui, j'espère, si tu parles de la
performance. Une application où une telle obfuscation faisait la
différence entre une performance acceptable et une performance
non-acceptable.
acte 1: il y a peu, on a pu lire ici des avis très "campés" sur le bon
usage des opérateurs "<<" et ">>", notamment certains trouvaient
choquant de les utiliser comme injecteurs / extracteurs puisqu'ils ne
seraient que des opérateurs mathématiques de décalage.
acte 2: "x << 1" serait /moins lisible/ que "2 * x"
ce bavardage (ou avis très personnel) m'amuse un peu, si un codeur C ne
sait pas lire "x << n" je lui conseillerais humblement de commencer à
s'initier au langage qu'il pense utiliser ou de passer à autre chose.
je dirais plutôt la qualité du compilo requiert ou non de coder soi-même
ces optimisations
acte 1: il y a peu, on a pu lire ici des avis très "campés" sur le bon
usage des opérateurs "<<" et ">>", notamment certains trouvaient
choquant de les utiliser comme injecteurs / extracteurs puisqu'ils ne
seraient que des opérateurs mathématiques de décalage.
acte 2: "x << 1" serait /moins lisible/ que "2 * x"
ce bavardage (ou avis très personnel) m'amuse un peu, si un codeur C ne
sait pas lire "x << n" je lui conseillerais humblement de commencer à
s'initier au langage qu'il pense utiliser ou de passer à autre chose.
je dirais plutôt la qualité du compilo requiert ou non de coder soi-même
ces optimisations
acte 1: il y a peu, on a pu lire ici des avis très "campés" sur le bon
usage des opérateurs "<<" et ">>", notamment certains trouvaient
choquant de les utiliser comme injecteurs / extracteurs puisqu'ils ne
seraient que des opérateurs mathématiques de décalage.
acte 2: "x << 1" serait /moins lisible/ que "2 * x"
ce bavardage (ou avis très personnel) m'amuse un peu, si un codeur C ne
sait pas lire "x << n" je lui conseillerais humblement de commencer à
s'initier au langage qu'il pense utiliser ou de passer à autre chose.
je dirais plutôt la qualité du compilo requiert ou non de coder soi-même
ces optimisations
acte 2: "x << 1" serait /moins lisible/ que "2 * x"
ce bavardage (ou avis très personnel) m'amuse un peu, si un codeur C ne
sait pas lire "x << n" je lui conseillerais humblement de commencer à
s'initier au langage qu'il pense utiliser ou de passer à autre chose.
pour faire x<<1 il faudra un cycle d'horloge
sur quel proc ? pour un 8086 il en faut 2 ;)pour faire 2*x également
non, en aucun cas, ou plutôt même si un MUL (au moins 70 cycles sur 8086)
demandait le même nombre de cycles, l'opération complète demande ici le
chargement de 2 opérandes (1 registre + 1 reg/mem) (vs valeur immédiate
pour un SHL).
d'accord sur la forme (l'architecture des CPU moderne aide à obtenir de
bonnes perfs) mais pas sur le fond (le bons sens n'est pas réservé aux
ingénieurs concevant les CPU et un développeur a le droit de savoir lire
et utiliser "x << n").
Sur mon système (Athlon XP) avec mon compilo (borland bcc55) le code 2*x
est compilé avec l'instruction SHL (décalage à gauche) de même que
x<<1... Le compilo a décidé (et je pense que sur cette plate-forme
précise il n'a pas tort) de l'optimisation...
et comment code-t-il (x * 80) ? ((x << 4) + (x << 6))
ou encore (x * 127) ? génére-t-il: (x << 7) - x ? (pas "- 1" !)
je dirais plutôt la qualité du compilo requiert ou non de coder soi-même
ces optimisations; si l'usage d'opérateurs shift apparait comme
"obfuscant" ce sont les aptitudes du programmeur qu'il faut questionner
plus d'une prétendue lisibilité.
acte 2: "x << 1" serait /moins lisible/ que "2 * x"
ce bavardage (ou avis très personnel) m'amuse un peu, si un codeur C ne
sait pas lire "x << n" je lui conseillerais humblement de commencer à
s'initier au langage qu'il pense utiliser ou de passer à autre chose.
pour faire x<<1 il faudra un cycle d'horloge
sur quel proc ? pour un 8086 il en faut 2 ;)
pour faire 2*x également
non, en aucun cas, ou plutôt même si un MUL (au moins 70 cycles sur 8086)
demandait le même nombre de cycles, l'opération complète demande ici le
chargement de 2 opérandes (1 registre + 1 reg/mem) (vs valeur immédiate
pour un SHL).
d'accord sur la forme (l'architecture des CPU moderne aide à obtenir de
bonnes perfs) mais pas sur le fond (le bons sens n'est pas réservé aux
ingénieurs concevant les CPU et un développeur a le droit de savoir lire
et utiliser "x << n").
Sur mon système (Athlon XP) avec mon compilo (borland bcc55) le code 2*x
est compilé avec l'instruction SHL (décalage à gauche) de même que
x<<1... Le compilo a décidé (et je pense que sur cette plate-forme
précise il n'a pas tort) de l'optimisation...
et comment code-t-il (x * 80) ? ((x << 4) + (x << 6))
ou encore (x * 127) ? génére-t-il: (x << 7) - x ? (pas "- 1" !)
je dirais plutôt la qualité du compilo requiert ou non de coder soi-même
ces optimisations; si l'usage d'opérateurs shift apparait comme
"obfuscant" ce sont les aptitudes du programmeur qu'il faut questionner
plus d'une prétendue lisibilité.
acte 2: "x << 1" serait /moins lisible/ que "2 * x"
ce bavardage (ou avis très personnel) m'amuse un peu, si un codeur C ne
sait pas lire "x << n" je lui conseillerais humblement de commencer à
s'initier au langage qu'il pense utiliser ou de passer à autre chose.
pour faire x<<1 il faudra un cycle d'horloge
sur quel proc ? pour un 8086 il en faut 2 ;)pour faire 2*x également
non, en aucun cas, ou plutôt même si un MUL (au moins 70 cycles sur 8086)
demandait le même nombre de cycles, l'opération complète demande ici le
chargement de 2 opérandes (1 registre + 1 reg/mem) (vs valeur immédiate
pour un SHL).
d'accord sur la forme (l'architecture des CPU moderne aide à obtenir de
bonnes perfs) mais pas sur le fond (le bons sens n'est pas réservé aux
ingénieurs concevant les CPU et un développeur a le droit de savoir lire
et utiliser "x << n").
Sur mon système (Athlon XP) avec mon compilo (borland bcc55) le code 2*x
est compilé avec l'instruction SHL (décalage à gauche) de même que
x<<1... Le compilo a décidé (et je pense que sur cette plate-forme
précise il n'a pas tort) de l'optimisation...
et comment code-t-il (x * 80) ? ((x << 4) + (x << 6))
ou encore (x * 127) ? génére-t-il: (x << 7) - x ? (pas "- 1" !)
je dirais plutôt la qualité du compilo requiert ou non de coder soi-même
ces optimisations; si l'usage d'opérateurs shift apparait comme
"obfuscant" ce sont les aptitudes du programmeur qu'il faut questionner
plus d'une prétendue lisibilité.
Euh... J'ai pas suivi, là. Ne sommes-nous pas sur un forum consacré au
C++ ?
Et franchement, si un codeur C++ utilise ce genre de hack,
Pour le C, je ne sais pas, je ne connais pas ce langage.
Non. Toute optimisation est commandée par le profiler,
une fois qu'on s'aperçoit que le
programme réel est effectivement trop lent.
Euh... J'ai pas suivi, là. Ne sommes-nous pas sur un forum consacré au
C++ ?
Et franchement, si un codeur C++ utilise ce genre de hack,
Pour le C, je ne sais pas, je ne connais pas ce langage.
Non. Toute optimisation est commandée par le profiler,
une fois qu'on s'aperçoit que le
programme réel est effectivement trop lent.
Euh... J'ai pas suivi, là. Ne sommes-nous pas sur un forum consacré au
C++ ?
Et franchement, si un codeur C++ utilise ce genre de hack,
Pour le C, je ne sais pas, je ne connais pas ce langage.
Non. Toute optimisation est commandée par le profiler,
une fois qu'on s'aperçoit que le
programme réel est effectivement trop lent.
On Sat, 04 Mar 2006 12:34:06 +0100, James Kanze :
(et se coder directement (x << 1))
Tu as de mesures à l'appui, j'espère, si tu parles de la
performance. Une application où une telle obfuscation faisait
la différence entre une performance acceptable et une
performance non-acceptable.
Et surtout, il y a de fortes chances pour que le compilo
génère le même code pour "x*2" et "x<<1"...
On Sat, 04 Mar 2006 12:34:06 +0100, James Kanze <kanze.james@neuf.fr>:
(et se coder directement (x << 1))
Tu as de mesures à l'appui, j'espère, si tu parles de la
performance. Une application où une telle obfuscation faisait
la différence entre une performance acceptable et une
performance non-acceptable.
Et surtout, il y a de fortes chances pour que le compilo
génère le même code pour "x*2" et "x<<1"...
On Sat, 04 Mar 2006 12:34:06 +0100, James Kanze :
(et se coder directement (x << 1))
Tu as de mesures à l'appui, j'espère, si tu parles de la
performance. Une application où une telle obfuscation faisait
la différence entre une performance acceptable et une
performance non-acceptable.
Et surtout, il y a de fortes chances pour que le compilo
génère le même code pour "x*2" et "x<<1"...
(et se coder directement (x << 1))
Sur ?
j'ai du mal à imaginer ce qui pourrait en faire douter.
ici le type retour a la même taille que l'argument donc le
meilleur codage (si on se soucie des perfs); une fonction
long Double(int) devrait elle être codée { return 2L * x; }
pour éviter l'overflow (si "int" n'a pas la taille de
"long").
oui, mais x<<1 ne se lit pas "facilement" comme le double de x
(alors que 2*x...) niveau performances, rien ne te permet
(comme le post de james kanze te le dit) que x<<1 est plus
rapide que 2*x. Sur un 8086, certes ;-) mais sur un cpu
moderne...
(et se coder directement (x << 1))
Sur ?
j'ai du mal à imaginer ce qui pourrait en faire douter.
ici le type retour a la même taille que l'argument donc le
meilleur codage (si on se soucie des perfs); une fonction
long Double(int) devrait elle être codée { return 2L * x; }
pour éviter l'overflow (si "int" n'a pas la taille de
"long").
oui, mais x<<1 ne se lit pas "facilement" comme le double de x
(alors que 2*x...) niveau performances, rien ne te permet
(comme le post de james kanze te le dit) que x<<1 est plus
rapide que 2*x. Sur un 8086, certes ;-) mais sur un cpu
moderne...
(et se coder directement (x << 1))
Sur ?
j'ai du mal à imaginer ce qui pourrait en faire douter.
ici le type retour a la même taille que l'argument donc le
meilleur codage (si on se soucie des perfs); une fonction
long Double(int) devrait elle être codée { return 2L * x; }
pour éviter l'overflow (si "int" n'a pas la taille de
"long").
oui, mais x<<1 ne se lit pas "facilement" comme le double de x
(alors que 2*x...) niveau performances, rien ne te permet
(comme le post de james kanze te le dit) que x<<1 est plus
rapide que 2*x. Sur un 8086, certes ;-) mais sur un cpu
moderne...
Alexandre wrote on 04/03/2006 16:52:
oui, mais x<<1 ne se lit pas "facilement" comme le double de
x (alors que 2*x...)
acte 1: il y a peu, on a pu lire ici des avis très "campés"
sur le bon usage des opérateurs "<<" et ">>", notamment
certains trouvaient choquant de les utiliser comme injecteurs
/ extracteurs puisqu'ils ne seraient que des opérateurs
mathématiques de décalage.
acte 2: "x << 1" serait /moins lisible/ que "2 * x"
ce bavardage (ou avis très personnel) m'amuse un peu, si un
codeur C ne sait pas lire "x << n" je lui conseillerais
humblement de commencer à s'initier au langage qu'il pense
utiliser ou de passer à autre chose.
niveau performances, rien ne te permet (comme le post de
james kanze te le dit) que x<<1 est plus rapide que 2*x. Sur
un 8086, certes ;-) mais sur un cpu moderne...
du post de James j'ai lu qu'il avait "une fois du mesurer"
mais il a oublié de présenter / commenter le résultat de sa
mesure; donc "rien ne me permet de penser" que son expérience
contredise ce point.
de ma propre expérience, je mesure et constate un gain; et ce
sur petits procs (8086) comme sur Sparc 2 avec Sun CC.
pour faire x<<1 il faudra un cycle d'horloge
sur quel proc ? pour un 8086 il en faut 2 ;)
pour faire 2*x également
non, en aucun cas, ou plutôt même si un MUL (au moins 70
cycles sur 8086) demandait le même nombre de cycles,
l'opération complète demande ici le chargement de 2 opérandes
(1 registre + 1 reg/mem) (vs valeur immédiate pour un SHL).
et comment code-t-il (x * 80) ? ((x << 4) + (x << 6))
ou encore (x * 127) ? génére-t-il: (x << 7) - x ? (pas "- 1" !)
Quoi qu'il en soit, la différence de vitesse AMA ne vaut pas
de perdre la lisibilité du code
je dirais plutôt la qualité du compilo requiert ou non de
coder soi-même ces optimisations; si l'usage d'opérateurs
shift apparait comme "obfuscant" ce sont les aptitudes du
programmeur qu'il faut questionner plus d'une prétendue
lisibilité.
Alexandre wrote on 04/03/2006 16:52:
oui, mais x<<1 ne se lit pas "facilement" comme le double de
x (alors que 2*x...)
acte 1: il y a peu, on a pu lire ici des avis très "campés"
sur le bon usage des opérateurs "<<" et ">>", notamment
certains trouvaient choquant de les utiliser comme injecteurs
/ extracteurs puisqu'ils ne seraient que des opérateurs
mathématiques de décalage.
acte 2: "x << 1" serait /moins lisible/ que "2 * x"
ce bavardage (ou avis très personnel) m'amuse un peu, si un
codeur C ne sait pas lire "x << n" je lui conseillerais
humblement de commencer à s'initier au langage qu'il pense
utiliser ou de passer à autre chose.
niveau performances, rien ne te permet (comme le post de
james kanze te le dit) que x<<1 est plus rapide que 2*x. Sur
un 8086, certes ;-) mais sur un cpu moderne...
du post de James j'ai lu qu'il avait "une fois du mesurer"
mais il a oublié de présenter / commenter le résultat de sa
mesure; donc "rien ne me permet de penser" que son expérience
contredise ce point.
de ma propre expérience, je mesure et constate un gain; et ce
sur petits procs (8086) comme sur Sparc 2 avec Sun CC.
pour faire x<<1 il faudra un cycle d'horloge
sur quel proc ? pour un 8086 il en faut 2 ;)
pour faire 2*x également
non, en aucun cas, ou plutôt même si un MUL (au moins 70
cycles sur 8086) demandait le même nombre de cycles,
l'opération complète demande ici le chargement de 2 opérandes
(1 registre + 1 reg/mem) (vs valeur immédiate pour un SHL).
et comment code-t-il (x * 80) ? ((x << 4) + (x << 6))
ou encore (x * 127) ? génére-t-il: (x << 7) - x ? (pas "- 1" !)
Quoi qu'il en soit, la différence de vitesse AMA ne vaut pas
de perdre la lisibilité du code
je dirais plutôt la qualité du compilo requiert ou non de
coder soi-même ces optimisations; si l'usage d'opérateurs
shift apparait comme "obfuscant" ce sont les aptitudes du
programmeur qu'il faut questionner plus d'une prétendue
lisibilité.
Alexandre wrote on 04/03/2006 16:52:
oui, mais x<<1 ne se lit pas "facilement" comme le double de
x (alors que 2*x...)
acte 1: il y a peu, on a pu lire ici des avis très "campés"
sur le bon usage des opérateurs "<<" et ">>", notamment
certains trouvaient choquant de les utiliser comme injecteurs
/ extracteurs puisqu'ils ne seraient que des opérateurs
mathématiques de décalage.
acte 2: "x << 1" serait /moins lisible/ que "2 * x"
ce bavardage (ou avis très personnel) m'amuse un peu, si un
codeur C ne sait pas lire "x << n" je lui conseillerais
humblement de commencer à s'initier au langage qu'il pense
utiliser ou de passer à autre chose.
niveau performances, rien ne te permet (comme le post de
james kanze te le dit) que x<<1 est plus rapide que 2*x. Sur
un 8086, certes ;-) mais sur un cpu moderne...
du post de James j'ai lu qu'il avait "une fois du mesurer"
mais il a oublié de présenter / commenter le résultat de sa
mesure; donc "rien ne me permet de penser" que son expérience
contredise ce point.
de ma propre expérience, je mesure et constate un gain; et ce
sur petits procs (8086) comme sur Sparc 2 avec Sun CC.
pour faire x<<1 il faudra un cycle d'horloge
sur quel proc ? pour un 8086 il en faut 2 ;)
pour faire 2*x également
non, en aucun cas, ou plutôt même si un MUL (au moins 70
cycles sur 8086) demandait le même nombre de cycles,
l'opération complète demande ici le chargement de 2 opérandes
(1 registre + 1 reg/mem) (vs valeur immédiate pour un SHL).
et comment code-t-il (x * 80) ? ((x << 4) + (x << 6))
ou encore (x * 127) ? génére-t-il: (x << 7) - x ? (pas "- 1" !)
Quoi qu'il en soit, la différence de vitesse AMA ne vaut pas
de perdre la lisibilité du code
je dirais plutôt la qualité du compilo requiert ou non de
coder soi-même ces optimisations; si l'usage d'opérateurs
shift apparait comme "obfuscant" ce sont les aptitudes du
programmeur qu'il faut questionner plus d'une prétendue
lisibilité.