Tu penses que Sylvain est un troll ? Je n'irais pas jusqu'à là.
c'est vraiment l'école du rire ce ng !...
Tu penses que Sylvain est un troll ? Je n'irais pas jusqu'à là.
c'est vraiment l'école du rire ce ng !...
Tu penses que Sylvain est un troll ? Je n'irais pas jusqu'à là.
c'est vraiment l'école du rire ce ng !...
Je suppose que là, vous n'êtes pas méprisant....
Non. Mais vous n'avez visiblement pas compris ce que voulait dire James,
étant donné votre réponse.
Ce n'était pas hors sujet. Ou du moins, si ça l'était, c'est vous qui
l'avez introduit en disant : « vouloir mettre l'usage de l'un dans
l'autre est source de duplication de code et ne parait pas vraiment
utile ni efficace. »
En quoi la duplication de code (généré, dans votre propos) n'est-elle
pas efficace ?
Sylvain
vouloir mettre l'usage de l'un dans l'autre est source de
duplication de code et ne parait pas vraiment utile ni
efficace.
James
Je ne sais pas en ce qui concerne l'efficacité -- il a été assez
efficace pour les applications où je m'en suis servi. En
revanche, je ne vois pas ton point en ce qui concerne la
duplication du code -- les templates sont là pour ça.
En revanche, je ne saisis pas le problème d'avoir du code binaire
dupliqué ? C'est par soucis de la taille de l'exécutable ?
En quoi cette solution ne vous semble-t-elle pas satisfaisante ?
Un template ne duplique pas le code source, ce qui, pour la maintenance
d'une application est essentiel. Donc « un template, ça duplique »,
soit, mais ça dépend de quoi l'on parle.
Par ailleurs, je comprends très bien le problème que pose la duplication
de code source, mais j'ai du mal à saisir le problème de la duplication
du code généré. Mais vos propos laissent entendre que la duplication de
code généré induit par les templates n'est pas une solution
satisfaisante. On peut donc en déduire que, pour vous, cette duplication
pose un problème. Lequel ?
Pourquoi n'avoir pas répondu quelque chose du genre : « Certes, le code
source n'est pas dupliqué, mais il reste de la duplication dans le code
généré » ? C'est certainement plus utile et plus efficace (critères dont
vous avez le soucis) que « excellente celle-là !! merci ! je la note en
tête des histoires droles. ».
Je suppose que là, vous n'êtes pas méprisant....
Non. Mais vous n'avez visiblement pas compris ce que voulait dire James,
étant donné votre réponse.
Ce n'était pas hors sujet. Ou du moins, si ça l'était, c'est vous qui
l'avez introduit en disant : « vouloir mettre l'usage de l'un dans
l'autre est source de duplication de code et ne parait pas vraiment
utile ni efficace. »
En quoi la duplication de code (généré, dans votre propos) n'est-elle
pas efficace ?
Sylvain
vouloir mettre l'usage de l'un dans l'autre est source de
duplication de code et ne parait pas vraiment utile ni
efficace.
James
Je ne sais pas en ce qui concerne l'efficacité -- il a été assez
efficace pour les applications où je m'en suis servi. En
revanche, je ne vois pas ton point en ce qui concerne la
duplication du code -- les templates sont là pour ça.
En revanche, je ne saisis pas le problème d'avoir du code binaire
dupliqué ? C'est par soucis de la taille de l'exécutable ?
En quoi cette solution ne vous semble-t-elle pas satisfaisante ?
Un template ne duplique pas le code source, ce qui, pour la maintenance
d'une application est essentiel. Donc « un template, ça duplique »,
soit, mais ça dépend de quoi l'on parle.
Par ailleurs, je comprends très bien le problème que pose la duplication
de code source, mais j'ai du mal à saisir le problème de la duplication
du code généré. Mais vos propos laissent entendre que la duplication de
code généré induit par les templates n'est pas une solution
satisfaisante. On peut donc en déduire que, pour vous, cette duplication
pose un problème. Lequel ?
Pourquoi n'avoir pas répondu quelque chose du genre : « Certes, le code
source n'est pas dupliqué, mais il reste de la duplication dans le code
généré » ? C'est certainement plus utile et plus efficace (critères dont
vous avez le soucis) que « excellente celle-là !! merci ! je la note en
tête des histoires droles. ».
Je suppose que là, vous n'êtes pas méprisant....
Non. Mais vous n'avez visiblement pas compris ce que voulait dire James,
étant donné votre réponse.
Ce n'était pas hors sujet. Ou du moins, si ça l'était, c'est vous qui
l'avez introduit en disant : « vouloir mettre l'usage de l'un dans
l'autre est source de duplication de code et ne parait pas vraiment
utile ni efficace. »
En quoi la duplication de code (généré, dans votre propos) n'est-elle
pas efficace ?
Sylvain
vouloir mettre l'usage de l'un dans l'autre est source de
duplication de code et ne parait pas vraiment utile ni
efficace.
James
Je ne sais pas en ce qui concerne l'efficacité -- il a été assez
efficace pour les applications où je m'en suis servi. En
revanche, je ne vois pas ton point en ce qui concerne la
duplication du code -- les templates sont là pour ça.
En revanche, je ne saisis pas le problème d'avoir du code binaire
dupliqué ? C'est par soucis de la taille de l'exécutable ?
En quoi cette solution ne vous semble-t-elle pas satisfaisante ?
Un template ne duplique pas le code source, ce qui, pour la maintenance
d'une application est essentiel. Donc « un template, ça duplique »,
soit, mais ça dépend de quoi l'on parle.
Par ailleurs, je comprends très bien le problème que pose la duplication
de code source, mais j'ai du mal à saisir le problème de la duplication
du code généré. Mais vos propos laissent entendre que la duplication de
code généré induit par les templates n'est pas une solution
satisfaisante. On peut donc en déduire que, pour vous, cette duplication
pose un problème. Lequel ?
Pourquoi n'avoir pas répondu quelque chose du genre : « Certes, le code
source n'est pas dupliqué, mais il reste de la duplication dans le code
généré » ? C'est certainement plus utile et plus efficace (critères dont
vous avez le soucis) que « excellente celle-là !! merci ! je la note en
tête des histoires droles. ».
ah les temporaires, un bon flush masqué dans un destructeur,
j'ai bon Monsieur devinette ?
Il n'y a pas de devinette. C'est devenu une technique quasiment
standard pour la gestion des fichiers de log.
C'est l'idiome du wrapper d'un flux. Je l'ai déjà présenté
maintes fois. (En fait, ce n'est qu'une incarnation particulière
du modèle de Proxy. Je l'ai trouvé ici dans certain code écrit
dans le même temps, peux-tu nous expliquer comment loguer
*une* fois la même erreur survenue dans X (64, 128, ...)
threads lancés simultanément mais échouant tous pour la même
raison (extérieure aux threads).
C'est simple -- le temporaire detient un lock. Pour toute sa
durée de vie.
peux-tu également indiquer où placer ton temporaire dans une
chaine d'appels de méthodes (le C++ est procédurale, non?)
d'où on sort par des catch / throw en cascade ?
Il n'y a pas le moindre catch ni throw. C'est le temporaire qui
fait tout le boulot.
ah les temporaires, un bon flush masqué dans un destructeur,
j'ai bon Monsieur devinette ?
Il n'y a pas de devinette. C'est devenu une technique quasiment
standard pour la gestion des fichiers de log.
C'est l'idiome du wrapper d'un flux. Je l'ai déjà présenté
maintes fois. (En fait, ce n'est qu'une incarnation particulière
du modèle de Proxy. Je l'ai trouvé ici dans certain code écrit
dans le même temps, peux-tu nous expliquer comment loguer
*une* fois la même erreur survenue dans X (64, 128, ...)
threads lancés simultanément mais échouant tous pour la même
raison (extérieure aux threads).
C'est simple -- le temporaire detient un lock. Pour toute sa
durée de vie.
peux-tu également indiquer où placer ton temporaire dans une
chaine d'appels de méthodes (le C++ est procédurale, non?)
d'où on sort par des catch / throw en cascade ?
Il n'y a pas le moindre catch ni throw. C'est le temporaire qui
fait tout le boulot.
ah les temporaires, un bon flush masqué dans un destructeur,
j'ai bon Monsieur devinette ?
Il n'y a pas de devinette. C'est devenu une technique quasiment
standard pour la gestion des fichiers de log.
C'est l'idiome du wrapper d'un flux. Je l'ai déjà présenté
maintes fois. (En fait, ce n'est qu'une incarnation particulière
du modèle de Proxy. Je l'ai trouvé ici dans certain code écrit
dans le même temps, peux-tu nous expliquer comment loguer
*une* fois la même erreur survenue dans X (64, 128, ...)
threads lancés simultanément mais échouant tous pour la même
raison (extérieure aux threads).
C'est simple -- le temporaire detient un lock. Pour toute sa
durée de vie.
peux-tu également indiquer où placer ton temporaire dans une
chaine d'appels de méthodes (le C++ est procédurale, non?)
d'où on sort par des catch / throw en cascade ?
Il n'y a pas le moindre catch ni throw. C'est le temporaire qui
fait tout le boulot.
Arnaud Meurgues wrote on 12/04/2006 08:40:
Sylvain
vouloir mettre l'usage de l'un dans l'autre est source de
duplication de code et ne parait pas vraiment utile ni
efficace.
James
Je ne sais pas en ce qui concerne l'efficacité -- il a été assez
efficace pour les applications où je m'en suis servi. En
revanche, je ne vois pas ton point en ce qui concerne la
duplication du code -- les templates sont là pour ça.
donc "mon point" sur la duplication n'a jamais existé - je
laisse à James ce qui est dit par James.
sur l'utilité:
un /gestionnaire d'erreur/ sert (notamment) à
- faire le ménage (là des tempo avec dstrc cleaner sont efficaces)
- enregistrer le contexte (pile d'appel, parametres, état interne)
- stabiliser le code (reprendre normalement le traitement) ou répercuter
l'erreur ou terminer en sauvant ce qui peut l'être.
un /stream avec opérateurs d'injection/ (je parlais de ça, pas d'un
mystérieux template, même si le truc utilisé peut être template b ased)
sert à:
- accumuler / collecter / formater de l'information.
ces 2 fonctionnalités me paraissent disjointes;
lorsque je maintiens mon stream pour lui apprendre à traiter
de caractères spéciaux (c'est un exemple) je me fous un peu de
savoir quel code d'erreur parmi n je retournerais au shell qui
lancera le run qui plante; inversement si je veux raffiner le
log des call stacks (c'est un autre exemple) je me fous de
savoir s'il existe pour mon streamer texte un opérateur <<
supportant le type qu'un collège inventera demain.
Arnaud Meurgues wrote on 12/04/2006 08:40:
Sylvain
vouloir mettre l'usage de l'un dans l'autre est source de
duplication de code et ne parait pas vraiment utile ni
efficace.
James
Je ne sais pas en ce qui concerne l'efficacité -- il a été assez
efficace pour les applications où je m'en suis servi. En
revanche, je ne vois pas ton point en ce qui concerne la
duplication du code -- les templates sont là pour ça.
donc "mon point" sur la duplication n'a jamais existé - je
laisse à James ce qui est dit par James.
sur l'utilité:
un /gestionnaire d'erreur/ sert (notamment) à
- faire le ménage (là des tempo avec dstrc cleaner sont efficaces)
- enregistrer le contexte (pile d'appel, parametres, état interne)
- stabiliser le code (reprendre normalement le traitement) ou répercuter
l'erreur ou terminer en sauvant ce qui peut l'être.
un /stream avec opérateurs d'injection/ (je parlais de ça, pas d'un
mystérieux template, même si le truc utilisé peut être template b ased)
sert à:
- accumuler / collecter / formater de l'information.
ces 2 fonctionnalités me paraissent disjointes;
lorsque je maintiens mon stream pour lui apprendre à traiter
de caractères spéciaux (c'est un exemple) je me fous un peu de
savoir quel code d'erreur parmi n je retournerais au shell qui
lancera le run qui plante; inversement si je veux raffiner le
log des call stacks (c'est un autre exemple) je me fous de
savoir s'il existe pour mon streamer texte un opérateur <<
supportant le type qu'un collège inventera demain.
Arnaud Meurgues wrote on 12/04/2006 08:40:
Sylvain
vouloir mettre l'usage de l'un dans l'autre est source de
duplication de code et ne parait pas vraiment utile ni
efficace.
James
Je ne sais pas en ce qui concerne l'efficacité -- il a été assez
efficace pour les applications où je m'en suis servi. En
revanche, je ne vois pas ton point en ce qui concerne la
duplication du code -- les templates sont là pour ça.
donc "mon point" sur la duplication n'a jamais existé - je
laisse à James ce qui est dit par James.
sur l'utilité:
un /gestionnaire d'erreur/ sert (notamment) à
- faire le ménage (là des tempo avec dstrc cleaner sont efficaces)
- enregistrer le contexte (pile d'appel, parametres, état interne)
- stabiliser le code (reprendre normalement le traitement) ou répercuter
l'erreur ou terminer en sauvant ce qui peut l'être.
un /stream avec opérateurs d'injection/ (je parlais de ça, pas d'un
mystérieux template, même si le truc utilisé peut être template b ased)
sert à:
- accumuler / collecter / formater de l'information.
ces 2 fonctionnalités me paraissent disjointes;
lorsque je maintiens mon stream pour lui apprendre à traiter
de caractères spéciaux (c'est un exemple) je me fous un peu de
savoir quel code d'erreur parmi n je retournerais au shell qui
lancera le run qui plante; inversement si je veux raffiner le
log des call stacks (c'est un autre exemple) je me fous de
savoir s'il existe pour mon streamer texte un opérateur <<
supportant le type qu'un collège inventera demain.
In news:,
kanze typed:C'est l'idiome du wrapper d'un flux. Je l'ai déjà présenté
maintes fois. (En fait, ce n'est qu'une incarnation
particulière du modèle de Proxy. Je l'ai trouvé ici dans
certain code écrit il y a plus de dix ans -- avec des {...}
en plus, parce que les compilateurs d'alors ne respectaient
pas la durée de vie telle qu'elle est définie par la norme
aujourd'hui.)
A propos de duree de vie, je sais que le code suivant est
correct:
void print(string const& s);
print(string("foo").append("bar"));
mais que se passe-t il pour celui ci:
void print(char const*s);
print(string("foo").append("bar").c_str());
Les deux compilateurs que j'ai sous la main (gcc4 et xlC6)
appellent le destructeur du temporaire quand il faut (cad
apres l'appel a print), mais je voudrait savoir si c'est un
comportement garanti ou bien juste un hasard
d'implementation...
In news:1144829411.014692.260670@t31g2000cwb.googlegroups.com,
kanze <kanze@gabi-soft.fr> typed:
C'est l'idiome du wrapper d'un flux. Je l'ai déjà présenté
maintes fois. (En fait, ce n'est qu'une incarnation
particulière du modèle de Proxy. Je l'ai trouvé ici dans
certain code écrit il y a plus de dix ans -- avec des {...}
en plus, parce que les compilateurs d'alors ne respectaient
pas la durée de vie telle qu'elle est définie par la norme
aujourd'hui.)
A propos de duree de vie, je sais que le code suivant est
correct:
void print(string const& s);
print(string("foo").append("bar"));
mais que se passe-t il pour celui ci:
void print(char const*s);
print(string("foo").append("bar").c_str());
Les deux compilateurs que j'ai sous la main (gcc4 et xlC6)
appellent le destructeur du temporaire quand il faut (cad
apres l'appel a print), mais je voudrait savoir si c'est un
comportement garanti ou bien juste un hasard
d'implementation...
In news:,
kanze typed:C'est l'idiome du wrapper d'un flux. Je l'ai déjà présenté
maintes fois. (En fait, ce n'est qu'une incarnation
particulière du modèle de Proxy. Je l'ai trouvé ici dans
certain code écrit il y a plus de dix ans -- avec des {...}
en plus, parce que les compilateurs d'alors ne respectaient
pas la durée de vie telle qu'elle est définie par la norme
aujourd'hui.)
A propos de duree de vie, je sais que le code suivant est
correct:
void print(string const& s);
print(string("foo").append("bar"));
mais que se passe-t il pour celui ci:
void print(char const*s);
print(string("foo").append("bar").c_str());
Les deux compilateurs que j'ai sous la main (gcc4 et xlC6)
appellent le destructeur du temporaire quand il faut (cad
apres l'appel a print), mais je voudrait savoir si c'est un
comportement garanti ou bien juste un hasard
d'implementation...
Michel Decima wrote:A propos de duree de vie, je sais que le code suivant est
correct:
void print(string const& s);
print(string("foo").append("bar"));
mais que se passe-t il pour celui ci:
void print(char const*s);
print(string("foo").append("bar").c_str());
Les deux cas sont identiques. C-à-d que s'il sont correct ou non
dépend de quand tu as écrit le code. Avant la norme, la durée de
vie dépendait de l'implémentation, et pourrait être n'importe
quoi entre « première utilisation », et le '}' suivant. Et dans
tes exemples, l'appel d'une fonction membre compte comme
utilisation -- le compilateur avait le droit d'appeler le
destructeur dès le rétour de append. (Dans la pratique, c'est
ce que faisait g++.)
La norme a spécifié beaucoup plus précisement : c'est à la fin
de l'expression complète. Ici, grosso modo, au ;. Dans la
pratique, tous les compilateurs qui avaient une durée de vie
plus courte l'ont étendue pour être conforme. Ceux qui avaient
une durée de vie plus longue, en revanche, ont souvent des
options pour avoir l'ancienne durée -- options qui sont, au
moins chez Sun, actives par défaut.
Les deux compilateurs que j'ai sous la main (gcc4 et xlC6)
appellent le destructeur du temporaire quand il faut (cad
apres l'appel a print), mais je voudrait savoir si c'est un
comportement garanti ou bien juste un hasard
d'implementation...
C'est garanti par la norme.
Michel Decima wrote:
A propos de duree de vie, je sais que le code suivant est
correct:
void print(string const& s);
print(string("foo").append("bar"));
mais que se passe-t il pour celui ci:
void print(char const*s);
print(string("foo").append("bar").c_str());
Les deux cas sont identiques. C-à-d que s'il sont correct ou non
dépend de quand tu as écrit le code. Avant la norme, la durée de
vie dépendait de l'implémentation, et pourrait être n'importe
quoi entre « première utilisation », et le '}' suivant. Et dans
tes exemples, l'appel d'une fonction membre compte comme
utilisation -- le compilateur avait le droit d'appeler le
destructeur dès le rétour de append. (Dans la pratique, c'est
ce que faisait g++.)
La norme a spécifié beaucoup plus précisement : c'est à la fin
de l'expression complète. Ici, grosso modo, au ;. Dans la
pratique, tous les compilateurs qui avaient une durée de vie
plus courte l'ont étendue pour être conforme. Ceux qui avaient
une durée de vie plus longue, en revanche, ont souvent des
options pour avoir l'ancienne durée -- options qui sont, au
moins chez Sun, actives par défaut.
Les deux compilateurs que j'ai sous la main (gcc4 et xlC6)
appellent le destructeur du temporaire quand il faut (cad
apres l'appel a print), mais je voudrait savoir si c'est un
comportement garanti ou bien juste un hasard
d'implementation...
C'est garanti par la norme.
Michel Decima wrote:A propos de duree de vie, je sais que le code suivant est
correct:
void print(string const& s);
print(string("foo").append("bar"));
mais que se passe-t il pour celui ci:
void print(char const*s);
print(string("foo").append("bar").c_str());
Les deux cas sont identiques. C-à-d que s'il sont correct ou non
dépend de quand tu as écrit le code. Avant la norme, la durée de
vie dépendait de l'implémentation, et pourrait être n'importe
quoi entre « première utilisation », et le '}' suivant. Et dans
tes exemples, l'appel d'une fonction membre compte comme
utilisation -- le compilateur avait le droit d'appeler le
destructeur dès le rétour de append. (Dans la pratique, c'est
ce que faisait g++.)
La norme a spécifié beaucoup plus précisement : c'est à la fin
de l'expression complète. Ici, grosso modo, au ;. Dans la
pratique, tous les compilateurs qui avaient une durée de vie
plus courte l'ont étendue pour être conforme. Ceux qui avaient
une durée de vie plus longue, en revanche, ont souvent des
options pour avoir l'ancienne durée -- options qui sont, au
moins chez Sun, actives par défaut.
Les deux compilateurs que j'ai sous la main (gcc4 et xlC6)
appellent le destructeur du temporaire quand il faut (cad
apres l'appel a print), mais je voudrait savoir si c'est un
comportement garanti ou bien juste un hasard
d'implementation...
C'est garanti par la norme.
-- Selon la configuration du log, la plupart des logs sont
typiquement désactivés. Et si les logs sont utilisés autant
qu'on veut, formatter le message du log qui n'apparaîtront
pas consumera beaucoup trop de temps CPU. En répoussant le
formattage dans la classe de log, on pourrait ne le faire
que si c'est utile.
Note bien que ce n'est pas le code appelant qui doit faire la
décision sur la termination. Il décide la gravité, et c'est le
sous-système de log/gestion d'erreur qui s'occupe de la reste.
Le programmeur écrit donc quelque chose du genre :
log.error( Log::serious ) << "x = " << x ;
-- Selon la configuration du log, la plupart des logs sont
typiquement désactivés. Et si les logs sont utilisés autant
qu'on veut, formatter le message du log qui n'apparaîtront
pas consumera beaucoup trop de temps CPU. En répoussant le
formattage dans la classe de log, on pourrait ne le faire
que si c'est utile.
Note bien que ce n'est pas le code appelant qui doit faire la
décision sur la termination. Il décide la gravité, et c'est le
sous-système de log/gestion d'erreur qui s'occupe de la reste.
Le programmeur écrit donc quelque chose du genre :
log.error( Log::serious ) << "x = " << x ;
-- Selon la configuration du log, la plupart des logs sont
typiquement désactivés. Et si les logs sont utilisés autant
qu'on veut, formatter le message du log qui n'apparaîtront
pas consumera beaucoup trop de temps CPU. En répoussant le
formattage dans la classe de log, on pourrait ne le faire
que si c'est utile.
Note bien que ce n'est pas le code appelant qui doit faire la
décision sur la termination. Il décide la gravité, et c'est le
sous-système de log/gestion d'erreur qui s'occupe de la reste.
Le programmeur écrit donc quelque chose du genre :
log.error( Log::serious ) << "x = " << x ;
In news:,
kanze typed:-- Selon la configuration du log, la plupart des logs sont
typiquement désactivés. Et si les logs sont utilisés autant
qu'on veut, formatter le message du log qui n'apparaîtront
pas consumera beaucoup trop de temps CPU. En répoussant le
formattage dans la classe de log, on pourrait ne le faire
que si c'est utile.
Note bien que ce n'est pas le code appelant qui doit faire la
décision sur la termination. Il décide la gravité, et c'est le
sous-système de log/gestion d'erreur qui s'occupe de la reste.
Le programmeur écrit donc quelque chose du genre :
log.error( Log::serious ) << "x = " << x ;
Si j'ai bien tout compris, le temporaire ne va faire le
formattage que si le log est active. Ca elimine le cout du
formattage, mais on a toujours celui des parametres injectes:
log.error( Log::serious ) << "result=" << maGrosseFonctionCouteuse();
Evidemment, il serait souhaitable d'injecter dans le log
uniquement des parametres "qui ne coutent rien a obtenir",
comme des variables du site appelant, mais des fois on ne peut
pas faire autrement... J'ai du mal a voir une solution qui
puisse fonctionner avec l'operation d'injection, et des log
qu'on peut activer/desactiver au runtime, a par ceci:
if (LogStream& slog = log.error( Log::serious )) {
slog << << "result=" << maGrosseFonctionCouteuse();
}
Existe-t il d'autres methodes ?
In news:1144919049.049957.29690@v46g2000cwv.googlegroups.com,
kanze <kanze@gabi-soft.fr> typed:
-- Selon la configuration du log, la plupart des logs sont
typiquement désactivés. Et si les logs sont utilisés autant
qu'on veut, formatter le message du log qui n'apparaîtront
pas consumera beaucoup trop de temps CPU. En répoussant le
formattage dans la classe de log, on pourrait ne le faire
que si c'est utile.
Note bien que ce n'est pas le code appelant qui doit faire la
décision sur la termination. Il décide la gravité, et c'est le
sous-système de log/gestion d'erreur qui s'occupe de la reste.
Le programmeur écrit donc quelque chose du genre :
log.error( Log::serious ) << "x = " << x ;
Si j'ai bien tout compris, le temporaire ne va faire le
formattage que si le log est active. Ca elimine le cout du
formattage, mais on a toujours celui des parametres injectes:
log.error( Log::serious ) << "result=" << maGrosseFonctionCouteuse();
Evidemment, il serait souhaitable d'injecter dans le log
uniquement des parametres "qui ne coutent rien a obtenir",
comme des variables du site appelant, mais des fois on ne peut
pas faire autrement... J'ai du mal a voir une solution qui
puisse fonctionner avec l'operation d'injection, et des log
qu'on peut activer/desactiver au runtime, a par ceci:
if (LogStream& slog = log.error( Log::serious )) {
slog << << "result=" << maGrosseFonctionCouteuse();
}
Existe-t il d'autres methodes ?
In news:,
kanze typed:-- Selon la configuration du log, la plupart des logs sont
typiquement désactivés. Et si les logs sont utilisés autant
qu'on veut, formatter le message du log qui n'apparaîtront
pas consumera beaucoup trop de temps CPU. En répoussant le
formattage dans la classe de log, on pourrait ne le faire
que si c'est utile.
Note bien que ce n'est pas le code appelant qui doit faire la
décision sur la termination. Il décide la gravité, et c'est le
sous-système de log/gestion d'erreur qui s'occupe de la reste.
Le programmeur écrit donc quelque chose du genre :
log.error( Log::serious ) << "x = " << x ;
Si j'ai bien tout compris, le temporaire ne va faire le
formattage que si le log est active. Ca elimine le cout du
formattage, mais on a toujours celui des parametres injectes:
log.error( Log::serious ) << "result=" << maGrosseFonctionCouteuse();
Evidemment, il serait souhaitable d'injecter dans le log
uniquement des parametres "qui ne coutent rien a obtenir",
comme des variables du site appelant, mais des fois on ne peut
pas faire autrement... J'ai du mal a voir une solution qui
puisse fonctionner avec l'operation d'injection, et des log
qu'on peut activer/desactiver au runtime, a par ceci:
if (LogStream& slog = log.error( Log::serious )) {
slog << << "result=" << maGrosseFonctionCouteuse();
}
Existe-t il d'autres methodes ?
Je vais
essayer de noter le comportement du compilateur Sun quelque
part...
Je vais
essayer de noter le comportement du compilateur Sun quelque
part...
Je vais
essayer de noter le comportement du compilateur Sun quelque
part...
log.error( Log::serious ) << "result=" << maGrosseFonctionCouteuse();
Evidemment, il serait souhaitable d'injecter dans le log uniquement
des parametres "qui ne coutent rien a obtenir", comme des variables du
site appelant, mais des fois on ne peut pas faire autrement...
J'ai du mal a voir une solution qui puisse fonctionner avec l'operation
d'injection, et des log qu'on peut activer/desactiver au runtime, a
par ceci:
if (LogStream& slog = log.error( Log::serious )) {
slog << << "result=" << maGrosseFonctionCouteuse();
}
Existe-t il d'autres methodes ?
log.error( Log::serious ) << "result=" << maGrosseFonctionCouteuse();
Evidemment, il serait souhaitable d'injecter dans le log uniquement
des parametres "qui ne coutent rien a obtenir", comme des variables du
site appelant, mais des fois on ne peut pas faire autrement...
J'ai du mal a voir une solution qui puisse fonctionner avec l'operation
d'injection, et des log qu'on peut activer/desactiver au runtime, a
par ceci:
if (LogStream& slog = log.error( Log::serious )) {
slog << << "result=" << maGrosseFonctionCouteuse();
}
Existe-t il d'autres methodes ?
log.error( Log::serious ) << "result=" << maGrosseFonctionCouteuse();
Evidemment, il serait souhaitable d'injecter dans le log uniquement
des parametres "qui ne coutent rien a obtenir", comme des variables du
site appelant, mais des fois on ne peut pas faire autrement...
J'ai du mal a voir une solution qui puisse fonctionner avec l'operation
d'injection, et des log qu'on peut activer/desactiver au runtime, a
par ceci:
if (LogStream& slog = log.error( Log::serious )) {
slog << << "result=" << maGrosseFonctionCouteuse();
}
Existe-t il d'autres methodes ?