On Mar 18, 5:07 pm, Mathias Gaunard wrote:Un pile usuelle fait dans les 8kUne pile usuelle de 1980 ?
Un compilateur pourrait a priori détecter, modulo l'usage de la
récursivité, de quelle taille la pile doit être et t'avertir dans le cas
où la pile nécessaire serait trop grande.
C'est ce que faisait des compilateurs anno 1980. On y est un peu
revenu parce que les tailles qu'ils trouvaient étaient
exhorbitantes. En fait, ce que le compilateur sait trouver,
c'est la taille qu'utilise chaque fonction. Ensuite, il faut
analyser tous les chemins dans la graphe des appels pour en
trouver le plus long.
Dans la pratique, évidemment, sur une machine moderne, la taille
de la pile ne serait pas 8 Ko, mais 8 Mo, ou plus. Je me
démande, d'ailleurs, si le posteur original ne s'est pas trompé
d'unités. Chez moi, on précise bien que la taille de la pile,
c'est 8192 sur une machine, 10240 sur l'autre. Mais l'unité,
c'est des Ko, et non des octets. (Et évidemment, on peut
l'agrandir si besoin y est.)et MAX_PATH (constante windowsienne
similaire) fait 32kUn chemin et un nom de fichier c'est pas exactement la même chose.Auriez-vous l'aimabilité de rapporter la valeur de FILENAME_MAX sur
vos implémentation ;-)Le plus long nom possible que j'ai trouvé en regardant les
caractéristiques des systèmes de fichiers c'est 4032 octets.Mais 255 est quand même une valeur récurrente.
J'ai 1024 sur une machine, 4096 sur l'autre. VC++ dit 260, mais
je me démande... Qu'est-ce qui se passe si je monte un système
de fichiers qui a des noms plus longs. Sous Posix, évidemment,
j'utiliserais plutôt « pathconf( dirname, _PC_NAME_MAX ) », de
façon à savoir pour le système de fichiers en question, mais je
ne connais pas l'équivalent sous Windows. (Il doit bien en
avoir ; sinon, le système serait difficilement utilisable dans
un reseau.)
On Mar 18, 5:07 pm, Mathias Gaunard <loufo...@gmail.com> wrote:
Un pile usuelle fait dans les 8k
Une pile usuelle de 1980 ?
Un compilateur pourrait a priori détecter, modulo l'usage de la
récursivité, de quelle taille la pile doit être et t'avertir dans le cas
où la pile nécessaire serait trop grande.
C'est ce que faisait des compilateurs anno 1980. On y est un peu
revenu parce que les tailles qu'ils trouvaient étaient
exhorbitantes. En fait, ce que le compilateur sait trouver,
c'est la taille qu'utilise chaque fonction. Ensuite, il faut
analyser tous les chemins dans la graphe des appels pour en
trouver le plus long.
Dans la pratique, évidemment, sur une machine moderne, la taille
de la pile ne serait pas 8 Ko, mais 8 Mo, ou plus. Je me
démande, d'ailleurs, si le posteur original ne s'est pas trompé
d'unités. Chez moi, on précise bien que la taille de la pile,
c'est 8192 sur une machine, 10240 sur l'autre. Mais l'unité,
c'est des Ko, et non des octets. (Et évidemment, on peut
l'agrandir si besoin y est.)
et MAX_PATH (constante windowsienne
similaire) fait 32k
Un chemin et un nom de fichier c'est pas exactement la même chose.
Auriez-vous l'aimabilité de rapporter la valeur de FILENAME_MAX sur
vos implémentation ;-)
Le plus long nom possible que j'ai trouvé en regardant les
caractéristiques des systèmes de fichiers c'est 4032 octets.
Mais 255 est quand même une valeur récurrente.
J'ai 1024 sur une machine, 4096 sur l'autre. VC++ dit 260, mais
je me démande... Qu'est-ce qui se passe si je monte un système
de fichiers qui a des noms plus longs. Sous Posix, évidemment,
j'utiliserais plutôt « pathconf( dirname, _PC_NAME_MAX ) », de
façon à savoir pour le système de fichiers en question, mais je
ne connais pas l'équivalent sous Windows. (Il doit bien en
avoir ; sinon, le système serait difficilement utilisable dans
un reseau.)
On Mar 18, 5:07 pm, Mathias Gaunard wrote:Un pile usuelle fait dans les 8kUne pile usuelle de 1980 ?
Un compilateur pourrait a priori détecter, modulo l'usage de la
récursivité, de quelle taille la pile doit être et t'avertir dans le cas
où la pile nécessaire serait trop grande.
C'est ce que faisait des compilateurs anno 1980. On y est un peu
revenu parce que les tailles qu'ils trouvaient étaient
exhorbitantes. En fait, ce que le compilateur sait trouver,
c'est la taille qu'utilise chaque fonction. Ensuite, il faut
analyser tous les chemins dans la graphe des appels pour en
trouver le plus long.
Dans la pratique, évidemment, sur une machine moderne, la taille
de la pile ne serait pas 8 Ko, mais 8 Mo, ou plus. Je me
démande, d'ailleurs, si le posteur original ne s'est pas trompé
d'unités. Chez moi, on précise bien que la taille de la pile,
c'est 8192 sur une machine, 10240 sur l'autre. Mais l'unité,
c'est des Ko, et non des octets. (Et évidemment, on peut
l'agrandir si besoin y est.)et MAX_PATH (constante windowsienne
similaire) fait 32kUn chemin et un nom de fichier c'est pas exactement la même chose.Auriez-vous l'aimabilité de rapporter la valeur de FILENAME_MAX sur
vos implémentation ;-)Le plus long nom possible que j'ai trouvé en regardant les
caractéristiques des systèmes de fichiers c'est 4032 octets.Mais 255 est quand même une valeur récurrente.
J'ai 1024 sur une machine, 4096 sur l'autre. VC++ dit 260, mais
je me démande... Qu'est-ce qui se passe si je monte un système
de fichiers qui a des noms plus longs. Sous Posix, évidemment,
j'utiliserais plutôt « pathconf( dirname, _PC_NAME_MAX ) », de
façon à savoir pour le système de fichiers en question, mais je
ne connais pas l'équivalent sous Windows. (Il doit bien en
avoir ; sinon, le système serait difficilement utilisable dans
un reseau.)
Peut etre que l'optimiseur est un peu benêt, il ne sais pas detecter
les constantes tout seul, et il faut l'aider un peu... mais j'ai un
gros doute quand meme, faut pas sous-estimer les capacités de ce genre
d'engins.
Peut etre que l'optimiseur est un peu benêt, il ne sais pas detecter
les constantes tout seul, et il faut l'aider un peu... mais j'ai un
gros doute quand meme, faut pas sous-estimer les capacités de ce genre
d'engins.
Peut etre que l'optimiseur est un peu benêt, il ne sais pas detecter
les constantes tout seul, et il faut l'aider un peu... mais j'ai un
gros doute quand meme, faut pas sous-estimer les capacités de ce genre
d'engins.
Je ne sais pas, la seule différence que je vois c'est qu'en
utilisant const on est assez souvent amené à définir deux fois
certaines fonctions comme les getteurs, une version const et
une version non-const, ce qui augmente la taille du code et
diminue un peu la vitesse pour des raisons de localité.
Je ne sais pas, la seule différence que je vois c'est qu'en
utilisant const on est assez souvent amené à définir deux fois
certaines fonctions comme les getteurs, une version const et
une version non-const, ce qui augmente la taille du code et
diminue un peu la vitesse pour des raisons de localité.
Je ne sais pas, la seule différence que je vois c'est qu'en
utilisant const on est assez souvent amené à définir deux fois
certaines fonctions comme les getteurs, une version const et
une version non-const, ce qui augmente la taille du code et
diminue un peu la vitesse pour des raisons de localité.
On Mar 18, 5:07 pm, Mathias Gaunard wrote:Un pile usuelle fait dans les 8k
Une pile usuelle de 1980 ?
Un compilateur pourrait a priori détecter, modulo l'usage de la
récursivité, de quelle taille la pile doit être et t'avertir dans le cas
où la pile nécessaire serait trop grande.
C'est ce que faisait des compilateurs anno 1980. On y est un peu
revenu parce que les tailles qu'ils trouvaient étaient
exhorbitantes. En fait, ce que le compilateur sait trouver,
c'est la taille qu'utilise chaque fonction. Ensuite, il faut
analyser tous les chemins dans la graphe des appels pour en
trouver le plus long.
Dans la pratique, évidemment, sur une machine moderne, la taille
de la pile ne serait pas 8 Ko, mais 8 Mo, ou plus. Je me
démande, d'ailleurs, si le posteur original ne s'est pas trompé
d'unités. Chez moi, on précise bien que la taille de la pile,
c'est 8192 sur une machine, 10240 sur l'autre. Mais l'unité,
c'est des Ko, et non des octets. (Et évidemment, on peut
l'agrandir si besoin y est.)et MAX_PATH (constante windowsienne
similaire) fait 32k
Un chemin et un nom de fichier c'est pas exactement la même chose.Auriez-vous l'aimabilité de rapporter la valeur de FILENAME_MAX sur
vos implémentation ;-)
Le plus long nom possible que j'ai trouvé en regardant les
caractéristiques des systèmes de fichiers c'est 4032 octets.
Mais 255 est quand même une valeur récurrente.
J'ai 1024 sur une machine, 4096 sur l'autre. VC++ dit 260, mais
je me démande... Qu'est-ce qui se passe si je monte un système
de fichiers qui a des noms plus longs. Sous Posix, évidemment,
j'utiliserais plutôt « pathconf( dirname, _PC_NAME_MAX ) », de
façon à savoir pour le système de fichiers en question, mais je
ne connais pas l'équivalent sous Windows. (Il doit bien en
avoir ; sinon, le système serait difficilement utilisable dans
un reseau.)
Windows possède deux façons pour saisir les chemins, L'une limitée à
MAX_PATH, et l'autre à environ 32000 (on doit saisir les chemins en wide
char, et sous la forme "?C:Mon chemin" ou
"?UNC<server><share>"). PLus d'infos surhttp://msdn2.microsoft.com/e n-us/library/aa365247.aspx.
Par contre, tous le logiciels n'arrivent pas forcément à s'y retrouver
avec ces chemins... Et je crois que Microsoft Office a déjà des
problèmes avant MAX_PATH.
On Mar 18, 5:07 pm, Mathias Gaunard <loufo...@gmail.com> wrote:
Un pile usuelle fait dans les 8k
Une pile usuelle de 1980 ?
Un compilateur pourrait a priori détecter, modulo l'usage de la
récursivité, de quelle taille la pile doit être et t'avertir dans le cas
où la pile nécessaire serait trop grande.
C'est ce que faisait des compilateurs anno 1980. On y est un peu
revenu parce que les tailles qu'ils trouvaient étaient
exhorbitantes. En fait, ce que le compilateur sait trouver,
c'est la taille qu'utilise chaque fonction. Ensuite, il faut
analyser tous les chemins dans la graphe des appels pour en
trouver le plus long.
Dans la pratique, évidemment, sur une machine moderne, la taille
de la pile ne serait pas 8 Ko, mais 8 Mo, ou plus. Je me
démande, d'ailleurs, si le posteur original ne s'est pas trompé
d'unités. Chez moi, on précise bien que la taille de la pile,
c'est 8192 sur une machine, 10240 sur l'autre. Mais l'unité,
c'est des Ko, et non des octets. (Et évidemment, on peut
l'agrandir si besoin y est.)
et MAX_PATH (constante windowsienne
similaire) fait 32k
Un chemin et un nom de fichier c'est pas exactement la même chose.
Auriez-vous l'aimabilité de rapporter la valeur de FILENAME_MAX sur
vos implémentation ;-)
Le plus long nom possible que j'ai trouvé en regardant les
caractéristiques des systèmes de fichiers c'est 4032 octets.
Mais 255 est quand même une valeur récurrente.
J'ai 1024 sur une machine, 4096 sur l'autre. VC++ dit 260, mais
je me démande... Qu'est-ce qui se passe si je monte un système
de fichiers qui a des noms plus longs. Sous Posix, évidemment,
j'utiliserais plutôt « pathconf( dirname, _PC_NAME_MAX ) », de
façon à savoir pour le système de fichiers en question, mais je
ne connais pas l'équivalent sous Windows. (Il doit bien en
avoir ; sinon, le système serait difficilement utilisable dans
un reseau.)
Windows possède deux façons pour saisir les chemins, L'une limitée à
MAX_PATH, et l'autre à environ 32000 (on doit saisir les chemins en wide
char, et sous la forme "\?C:Mon chemin" ou
"\?UNC<server><share>"). PLus d'infos surhttp://msdn2.microsoft.com/e n-us/library/aa365247.aspx.
Par contre, tous le logiciels n'arrivent pas forcément à s'y retrouver
avec ces chemins... Et je crois que Microsoft Office a déjà des
problèmes avant MAX_PATH.
On Mar 18, 5:07 pm, Mathias Gaunard wrote:Un pile usuelle fait dans les 8k
Une pile usuelle de 1980 ?
Un compilateur pourrait a priori détecter, modulo l'usage de la
récursivité, de quelle taille la pile doit être et t'avertir dans le cas
où la pile nécessaire serait trop grande.
C'est ce que faisait des compilateurs anno 1980. On y est un peu
revenu parce que les tailles qu'ils trouvaient étaient
exhorbitantes. En fait, ce que le compilateur sait trouver,
c'est la taille qu'utilise chaque fonction. Ensuite, il faut
analyser tous les chemins dans la graphe des appels pour en
trouver le plus long.
Dans la pratique, évidemment, sur une machine moderne, la taille
de la pile ne serait pas 8 Ko, mais 8 Mo, ou plus. Je me
démande, d'ailleurs, si le posteur original ne s'est pas trompé
d'unités. Chez moi, on précise bien que la taille de la pile,
c'est 8192 sur une machine, 10240 sur l'autre. Mais l'unité,
c'est des Ko, et non des octets. (Et évidemment, on peut
l'agrandir si besoin y est.)et MAX_PATH (constante windowsienne
similaire) fait 32k
Un chemin et un nom de fichier c'est pas exactement la même chose.Auriez-vous l'aimabilité de rapporter la valeur de FILENAME_MAX sur
vos implémentation ;-)
Le plus long nom possible que j'ai trouvé en regardant les
caractéristiques des systèmes de fichiers c'est 4032 octets.
Mais 255 est quand même une valeur récurrente.
J'ai 1024 sur une machine, 4096 sur l'autre. VC++ dit 260, mais
je me démande... Qu'est-ce qui se passe si je monte un système
de fichiers qui a des noms plus longs. Sous Posix, évidemment,
j'utiliserais plutôt « pathconf( dirname, _PC_NAME_MAX ) », de
façon à savoir pour le système de fichiers en question, mais je
ne connais pas l'équivalent sous Windows. (Il doit bien en
avoir ; sinon, le système serait difficilement utilisable dans
un reseau.)
Windows possède deux façons pour saisir les chemins, L'une limitée à
MAX_PATH, et l'autre à environ 32000 (on doit saisir les chemins en wide
char, et sous la forme "?C:Mon chemin" ou
"?UNC<server><share>"). PLus d'infos surhttp://msdn2.microsoft.com/e n-us/library/aa365247.aspx.
Par contre, tous le logiciels n'arrivent pas forcément à s'y retrouver
avec ces chemins... Et je crois que Microsoft Office a déjà des
problèmes avant MAX_PATH.
wrote:J'indique au compilateur que txt_buffer ne sera pas modifié afin qu'il
puisse effectuer une optimisation dont je n'ai peut être pas
connaissance.
Petite précision : le mot-clé const n'a aucune incidence
sur les performances, il sert juste à éviter certains bugs
et à améliorer la lisibilité du code.
hyr...@gmail.com wrote:
J'indique au compilateur que txt_buffer ne sera pas modifié afin qu'il
puisse effectuer une optimisation dont je n'ai peut être pas
connaissance.
Petite précision : le mot-clé const n'a aucune incidence
sur les performances, il sert juste à éviter certains bugs
et à améliorer la lisibilité du code.
wrote:J'indique au compilateur que txt_buffer ne sera pas modifié afin qu'il
puisse effectuer une optimisation dont je n'ai peut être pas
connaissance.
Petite précision : le mot-clé const n'a aucune incidence
sur les performances, il sert juste à éviter certains bugs
et à améliorer la lisibilité du code.
On 19 mar, 10:55, Sylvain Togni <"sylvain.togni at visionobjects.com">
wrote:wrote:J'indique au compilateur que txt_buffer ne sera pas modifié afin qu 'il
puisse effectuer une optimisation dont je n'ai peut être pas
connaissance.
Petite précision : le mot-clé const n'a aucune incidence
sur les performances, il sert juste à éviter certains bugs
et à améliorer la lisibilité du code.
D'autres confirment?
Ca serait très décevant de la part des compilateurs.
Par exemple:
on fixe une valeur et par la suite on a besoin de sa racine:
const float pi = 7;
float f = sqrt(pi).
Si un compilateur soit disant évolué appelle sqrt à chaque itérat ion,
il est pas très malin puisque pi et sqrt sont connues au moment de la
compilation*.
Je m'attend à ce que ces 2 lignes, écrites ainsi pour
assurer la lisibilité du code, soient remplacée par l'équivalent en
langage machine de
float f = 1.772004515;
* sqrt n'est pas vraiment "connue" au moment de la compilation, c'est
une fonction surement déclarée hors de l'unité de traduction courra nt.
Mais GCC compile jusqu'en 3 passes (-O3) et Visual C++ retarde une
partie de la compilation au liage de l'application ("whole program
optimizations"). Il y a donc, dans les 2cas, moyen de "remplacer"
sqrt(pi) par 1.77.
On 19 mar, 10:55, Sylvain Togni <"sylvain.togni at visionobjects.com">
wrote:
hyr...@gmail.com wrote:
J'indique au compilateur que txt_buffer ne sera pas modifié afin qu 'il
puisse effectuer une optimisation dont je n'ai peut être pas
connaissance.
Petite précision : le mot-clé const n'a aucune incidence
sur les performances, il sert juste à éviter certains bugs
et à améliorer la lisibilité du code.
D'autres confirment?
Ca serait très décevant de la part des compilateurs.
Par exemple:
on fixe une valeur et par la suite on a besoin de sa racine:
const float pi = 7;
float f = sqrt(pi).
Si un compilateur soit disant évolué appelle sqrt à chaque itérat ion,
il est pas très malin puisque pi et sqrt sont connues au moment de la
compilation*.
Je m'attend à ce que ces 2 lignes, écrites ainsi pour
assurer la lisibilité du code, soient remplacée par l'équivalent en
langage machine de
float f = 1.772004515;
* sqrt n'est pas vraiment "connue" au moment de la compilation, c'est
une fonction surement déclarée hors de l'unité de traduction courra nt.
Mais GCC compile jusqu'en 3 passes (-O3) et Visual C++ retarde une
partie de la compilation au liage de l'application ("whole program
optimizations"). Il y a donc, dans les 2cas, moyen de "remplacer"
sqrt(pi) par 1.77.
On 19 mar, 10:55, Sylvain Togni <"sylvain.togni at visionobjects.com">
wrote:wrote:J'indique au compilateur que txt_buffer ne sera pas modifié afin qu 'il
puisse effectuer une optimisation dont je n'ai peut être pas
connaissance.
Petite précision : le mot-clé const n'a aucune incidence
sur les performances, il sert juste à éviter certains bugs
et à améliorer la lisibilité du code.
D'autres confirment?
Ca serait très décevant de la part des compilateurs.
Par exemple:
on fixe une valeur et par la suite on a besoin de sa racine:
const float pi = 7;
float f = sqrt(pi).
Si un compilateur soit disant évolué appelle sqrt à chaque itérat ion,
il est pas très malin puisque pi et sqrt sont connues au moment de la
compilation*.
Je m'attend à ce que ces 2 lignes, écrites ainsi pour
assurer la lisibilité du code, soient remplacée par l'équivalent en
langage machine de
float f = 1.772004515;
* sqrt n'est pas vraiment "connue" au moment de la compilation, c'est
une fonction surement déclarée hors de l'unité de traduction courra nt.
Mais GCC compile jusqu'en 3 passes (-O3) et Visual C++ retarde une
partie de la compilation au liage de l'application ("whole program
optimizations"). Il y a donc, dans les 2cas, moyen de "remplacer"
sqrt(pi) par 1.77.
wrote:Par exemple:
on fixe une valeur et par la suite on a besoin de sa racine:
const float pi = 7;
float f = sqrt(pi).
Si un compilateur soit disant évolué appelle sqrt à chaque itér ation,
il est pas très malin puisque pi et sqrt sont connues au moment de la
compilation*. Je m'attend à ce que ces 2 lignes, écrites ainsi pour
assurer la lisibilité du code, soient remplacée par l'équivalent en
langage machine de
float f = 1.772004515;
Oui, peut-être que le compilateur fera l'optimisation, mais
il la fera aussi bien si la variable pi n'est pas déclarée
const.
Les compilateurs, dans la plupart des cas, savent mieux que
le programmeur quelle variable est constante et quelle ne
l'est pas.
Preuve en est, ils émettent une erreur quand
on essaie de modifier une variable const.
hyr...@gmail.com wrote:
Par exemple:
on fixe une valeur et par la suite on a besoin de sa racine:
const float pi = 7;
float f = sqrt(pi).
Si un compilateur soit disant évolué appelle sqrt à chaque itér ation,
il est pas très malin puisque pi et sqrt sont connues au moment de la
compilation*. Je m'attend à ce que ces 2 lignes, écrites ainsi pour
assurer la lisibilité du code, soient remplacée par l'équivalent en
langage machine de
float f = 1.772004515;
Oui, peut-être que le compilateur fera l'optimisation, mais
il la fera aussi bien si la variable pi n'est pas déclarée
const.
Les compilateurs, dans la plupart des cas, savent mieux que
le programmeur quelle variable est constante et quelle ne
l'est pas.
Preuve en est, ils émettent une erreur quand
on essaie de modifier une variable const.
wrote:Par exemple:
on fixe une valeur et par la suite on a besoin de sa racine:
const float pi = 7;
float f = sqrt(pi).
Si un compilateur soit disant évolué appelle sqrt à chaque itér ation,
il est pas très malin puisque pi et sqrt sont connues au moment de la
compilation*. Je m'attend à ce que ces 2 lignes, écrites ainsi pour
assurer la lisibilité du code, soient remplacée par l'équivalent en
langage machine de
float f = 1.772004515;
Oui, peut-être que le compilateur fera l'optimisation, mais
il la fera aussi bien si la variable pi n'est pas déclarée
const.
Les compilateurs, dans la plupart des cas, savent mieux que
le programmeur quelle variable est constante et quelle ne
l'est pas.
Preuve en est, ils émettent une erreur quand
on essaie de modifier une variable const.
Si un compilateur soit disant évolué appelle sqrt à chaque itération,
il est pas très malin puisque pi et sqrt sont connues au moment de la
compilation*.
Il le fait, en revanche. Parce que comment sait-il que sqrt(7)
renvoie toujours la même valeur ?
Si un compilateur soit disant évolué appelle sqrt à chaque itération,
il est pas très malin puisque pi et sqrt sont connues au moment de la
compilation*.
Il le fait, en revanche. Parce que comment sait-il que sqrt(7)
renvoie toujours la même valeur ?
Si un compilateur soit disant évolué appelle sqrt à chaque itération,
il est pas très malin puisque pi et sqrt sont connues au moment de la
compilation*.
Il le fait, en revanche. Parce que comment sait-il que sqrt(7)
renvoie toujours la même valeur ?
Michel Decima wrote:Petite précision : le mot-clé const n'a aucune incidence
sur les performances, il sert juste à éviter certains bugs
et à améliorer la lisibilité du code.
La documentation de mon compilateur (xlC-6/AIX) me dit "Use the const
qualifier whenever possible" dans la section "Coding Techniques That Can
Improve Performance".
D'un autre coté, le titre de la section dit que ca _peut_ améliorer les
choses, pas que ca le fait systématiquement.
Je ne sais pas, la seule différence que je vois c'est qu'en
utilisant const on est assez souvent amené à définir deux fois
certaines fonctions comme les getteurs, une version const et
une version non-const, ce qui augmente la taille du code et
diminue un peu la vitesse pour des raisons de localité.
Michel Decima wrote:
Petite précision : le mot-clé const n'a aucune incidence
sur les performances, il sert juste à éviter certains bugs
et à améliorer la lisibilité du code.
La documentation de mon compilateur (xlC-6/AIX) me dit "Use the const
qualifier whenever possible" dans la section "Coding Techniques That Can
Improve Performance".
D'un autre coté, le titre de la section dit que ca _peut_ améliorer les
choses, pas que ca le fait systématiquement.
Je ne sais pas, la seule différence que je vois c'est qu'en
utilisant const on est assez souvent amené à définir deux fois
certaines fonctions comme les getteurs, une version const et
une version non-const, ce qui augmente la taille du code et
diminue un peu la vitesse pour des raisons de localité.
Michel Decima wrote:Petite précision : le mot-clé const n'a aucune incidence
sur les performances, il sert juste à éviter certains bugs
et à améliorer la lisibilité du code.
La documentation de mon compilateur (xlC-6/AIX) me dit "Use the const
qualifier whenever possible" dans la section "Coding Techniques That Can
Improve Performance".
D'un autre coté, le titre de la section dit que ca _peut_ améliorer les
choses, pas que ca le fait systématiquement.
Je ne sais pas, la seule différence que je vois c'est qu'en
utilisant const on est assez souvent amené à définir deux fois
certaines fonctions comme les getteurs, une version const et
une version non-const, ce qui augmente la taille du code et
diminue un peu la vitesse pour des raisons de localité.
Un petit essai (pas très rigueureux) montre que le const fait
une différence et avec g++ et avec Sun CC sous Solaris, et avec
g++ sous Linux. Essaie donc :
double const d = 1.0009 ;
double tot1 = 1.0 ;
double tot2 = 1.0 ;
for ( int i = 0 ; i < 1000000000 ; ++ i ) {
f( d ) ;
tot1 += 2.0 * d + 1.0 ;
tot2 += 3.0 * d + 2.0 ;
}
Avec « void f( double const& ) ». Puis sans le const sur d.
Les temps sont bien différents.
Un petit essai (pas très rigueureux) montre que le const fait
une différence et avec g++ et avec Sun CC sous Solaris, et avec
g++ sous Linux. Essaie donc :
double const d = 1.0009 ;
double tot1 = 1.0 ;
double tot2 = 1.0 ;
for ( int i = 0 ; i < 1000000000 ; ++ i ) {
f( d ) ;
tot1 += 2.0 * d + 1.0 ;
tot2 += 3.0 * d + 2.0 ;
}
Avec « void f( double const& ) ». Puis sans le const sur d.
Les temps sont bien différents.
Un petit essai (pas très rigueureux) montre que le const fait
une différence et avec g++ et avec Sun CC sous Solaris, et avec
g++ sous Linux. Essaie donc :
double const d = 1.0009 ;
double tot1 = 1.0 ;
double tot2 = 1.0 ;
for ( int i = 0 ; i < 1000000000 ; ++ i ) {
f( d ) ;
tot1 += 2.0 * d + 1.0 ;
tot2 += 3.0 * d + 2.0 ;
}
Avec « void f( double const& ) ». Puis sans le const sur d.
Les temps sont bien différents.