 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Chat Guest
|
Posted: Thu Apr 15, 2004 8:35 am Post subject: efficacité d'une var. ou d'un attribut |
|
|
Bonjour,
je me pose une question qu'est ce qui est le + interressant de faire en
termes d'occupation memoire.
Si j'ai une fonction qui utilise une var locale, cette fonction-membre
est appellée assez frequemment, ne vaut mieux t'il pas mettre cette var
locale en attribut???
est ce que ça apporte quelque chose de grapiller de l'espace memoire en
termes de vitesse d'execution de cette fonction??
merci
|
|
| Back to top |
|
 |
Matthieu Moy Guest
|
Posted: Thu Apr 15, 2004 8:42 am Post subject: Re: efficacité d'une var. ou d'un attribut |
|
|
Chat <chat (AT) nospam (DOT) com> writes:
| Quote: | Bonjour,
je me pose une question qu'est ce qui est le + interressant de faire
en termes d'occupation memoire.
Si j'ai une fonction qui utilise une var locale, cette fonction-membre
est appellée assez frequemment, ne vaut mieux t'il pas mettre cette
var locale en attribut???
|
L'objet est passé par référence à la fonction membre, donc, pour
accéder à un attribut, il faut un indirection de pointeur, alors que
pour une variable locale, c'est un accès direct.
Donc, à priori, la variable locale ira plus vite.
--
Matthieu
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Thu Apr 15, 2004 8:57 am Post subject: Re: efficacité d'une var. ou d'un attribut |
|
|
Chat <chat (AT) nospam (DOT) com> writes:
| Quote: | Bonjour,
je me pose une question qu'est ce qui est le + interressant de faire en
termes d'occupation memoire.
Si j'ai une fonction qui utilise une var locale, cette fonction-membre est
appellée assez frequemment, ne vaut mieux t'il pas mettre cette var locale
en attribut???
est ce que ça apporte quelque chose de grapiller de l'espace memoire en
termes de vitesse d'execution de cette fonction??
|
La variable locale est a priori plus rapide et utilise de la memoire
de facon moins permanente. La passer en membre n'a donc de sens que
si son initialisation est couteuse et peut alors etre evitee.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
|
|
| Back to top |
|
 |
Pierre Maurette Guest
|
Posted: Thu Apr 15, 2004 9:54 am Post subject: Re: efficacité d'une var. ou d'un attribut |
|
|
Chat <chat (AT) nospam (DOT) com> typa:
| Quote: | Bonjour,
je me pose une question qu'est ce qui est le + interressant de faire en
termes d'occupation memoire.
Si j'ai une fonction qui utilise une var locale, cette fonction-membre
est appellée assez frequemment, ne vaut mieux t'il pas mettre cette var
locale en attribut???
Je ne pense pas. |
Un détail: attribut ou variable locale statique, la place occupée par
la variable est la même. Pour une variable locale auto, cette taille
peut être zéro. Le code devrait occuper un peu plus de place dans le
cas d'un attribut.
Une vraie variable locale (auto, non statique, non volatile) ne sera
souvent tout simplement pas créée en mémoire. Donc, gain sur tous les
plans. Laissez le compilateur optimiser à sa guise. Ce que je ne sais
pas, c'est si le compilateur peut optimiser grave, au point de
détecter qu'un attribut (private, of course) n'est utilisé que dans
une seule fonction membre et optimiser en connséquence. Je pense que
non.
De plus, bien que ce ne soit pas votre question, il est certainement
préférable de respecter le "sens".
Et transformer une vrai variable locale en attribut n'est pas naturel
du tout.
Dans le cas d'une variable locale statique, la question peut se poser.
L'avantage est à la variable locale, puisque son adresse est codée en
constante, celle de l'attribut en this + constante. La différence ne
doit pas être significative, personellement, je mettrais en attribut
si la variable a un sens pour la classe.
| Quote: | est ce que ça apporte quelque chose de grapiller de l'espace memoire en
termes de vitesse d'execution de cette fonction??
Du dérisoire, je suppose. Opinion personnelle déjà donnée, coder selon |
la sémantique et laisser popol optimiser.
Pierre
|
|
| Back to top |
|
 |
Pierre Maurette Guest
|
Posted: Thu Apr 15, 2004 9:54 am Post subject: Re: efficacité d'une var. ou d'un attribut |
|
|
Matthieu Moy <MatthieuNOSPAM.Moy (AT) imag (DOT) fr.invalid> typa:
| Quote: | Chat <chat (AT) nospam (DOT) com> writes:
Bonjour,
je me pose une question qu'est ce qui est le + interressant de faire
en termes d'occupation memoire.
Si j'ai une fonction qui utilise une var locale, cette fonction-membre
est appellée assez frequemment, ne vaut mieux t'il pas mettre cette
var locale en attribut???
L'objet est passé par référence à la fonction membre, donc, pour
accéder à un attribut, il faut un indirection de pointeur, alors que
pour une variable locale, c'est un accès direct.
Pour une statique. Pour une auto, soit elle n'existe pas en mémoire, |
soit elle est réellement créée, dans la pile par exemple (selon
l'implémentation), ce qui correspond à une indirection. Mais je pense
que en termes de vitesse, ça doit être kif kif.
Pierre
|
|
| Back to top |
|
 |
Matthieu Moy Guest
|
Posted: Thu Apr 15, 2004 10:55 am Post subject: Re: efficacité d'une var. ou d'un attribut |
|
|
Pierre Maurette <maurette.pierre (AT) free (DOT) fr> writes:
| Quote: | L'objet est passé par référence à la fonction membre, donc, pour
accéder à un attribut, il faut un indirection de pointeur, alors que
pour une variable locale, c'est un accès direct.
Pour une statique. Pour une auto, soit elle n'existe pas en mémoire,
soit elle est réellement créée, dans la pile par exemple (selon
l'implémentation), ce qui correspond à une indirection.
|
Oui, mais si tu comptes l'indirection par rapport au pointeur de pile,
dans le cas d'un attribut, il y a /deux/ indirections : Récupérer la
valeur du pointeur vers l'objet sur la pile, puis accéder à l'objet.
| Quote: | Mais je pense que en termes de vitesse, ça doit être kif kif.
|
Petit benchmark à l'appui, la variable locale est un peu plus rapide
avec g++, mais sur mon exemple, les deux sont équivalentes avec "g++
-O3". (Et d'ailleurs, je suis impressionné : il y a un facteur prèsque
20 entre la version optimisée et la version non optimisée !!)
#include <iostream>
struct A {
int f(int y) {
int x; // On peut le mettre en attribut pour comparer.
x = y + 1;
x = x * x;
x = x + y;
}
};
int main() {
int res = 0;
A a;
for (int i = 0; i <= 100000000; i++) {
res += a.f(i%10) % 1000;
}
std::cout << "res = " << res << std::endl;
}
Bref, si la variable est locale conceptuellement, aucune raison de la
passer en attribut.
--
Matthieu
|
|
| Back to top |
|
 |
Pierre Maurette Guest
|
Posted: Thu Apr 15, 2004 1:00 pm Post subject: Re: efficacité d'une var. ou d'un attribut |
|
|
Matthieu Moy <MatthieuNOSPAM.Moy (AT) imag (DOT) fr.invalid> typa:
| Quote: | Pierre Maurette <maurette.pierre (AT) free (DOT) fr> writes:
L'objet est passé par référence à la fonction membre, donc, pour
accéder à un attribut, il faut un indirection de pointeur, alors que
pour une variable locale, c'est un accès direct.
Pour une statique. Pour une auto, soit elle n'existe pas en mémoire,
soit elle est réellement créée, dans la pile par exemple (selon
l'implémentation), ce qui correspond à une indirection.
Oui, mais si tu comptes l'indirection par rapport au pointeur de pile,
dans le cas d'un attribut, il y a /deux/ indirections : Récupérer la
valeur du pointeur vers l'objet sur la pile, puis accéder à l'objet.
Oui da. |
| Quote: | Mais je pense que en termes de vitesse, ça doit être kif kif.
Petit benchmark à l'appui, la variable locale est un peu plus rapide
avec g++, mais sur mon exemple, les deux sont équivalentes avec "g++
-O3". (Et d'ailleurs, je suis impressionné : il y a un facteur prèsque
20 entre la version optimisée et la version non optimisée !!)
#include
struct A {
int f(int y) {
int x; // On peut le mettre en attribut pour comparer.
x = y + 1;
x = x * x;
x = x + y;
}
};
int main() {
int res = 0;
A a;
for (int i = 0; i <= 100000000; i++) {
res += a.f(i%10) % 1000;
}
std::cout << "res = " << res << std::endl;
}
Pas de return ? |
| Quote: | Bref, si la variable est locale conceptuellement, aucune raison de la
passer en attribut.
Je pense que c'est la morale principale de l'histoire. |
Et puis un attribut n'est pas une variable locale.
Un attribut "normal" est statique par rapport à l'instance, un
attribut static est statique par rapport à la classe, une variable
locale static est statique par rapport à la classe (dites-moi si je me
trompe), et une variable locale auto est ... une variable locale auto.
Pierre
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Apr 15, 2004 6:21 pm Post subject: Re: efficacité d'une var. ou d'un attribut |
|
|
On Thu, 15 Apr 2004 15:00:53 +0200, Pierre Maurette
<maurette.pierre (AT) free (DOT) fr> wrote:
| Quote: | int main() {
Pas de return ?
|
Non, le return dans main() est implicite.
--
FLL, Epagneul Breton
|
|
| Back to top |
|
 |
Alexandre Guest
|
Posted: Thu Apr 15, 2004 6:23 pm Post subject: Re: efficacité d'une var. ou d'un attribut |
|
|
<snip>
| Quote: | est ce que ça apporte quelque chose de grapiller de l'espace memoire en
termes de vitesse d'execution de cette fonction??
Du dérisoire, je suppose. Opinion personnelle déjà donnée, coder selon
la sémantique et laisser popol optimiser.
|
surtout que <mode citation on> Une optimisation précose est la source de
tous les mots <mode citation off>
D'accord avec vous, un attribut doit être dans une classe s'il a un sens,
point barre. L'exemple type, pour moi, parce que je me bagarre souvent avec
mes étudiants à cause de ça, c'est une classe utilisant un std::list, ou une
classe implémentant une structure de ce type : mets-on dedans un itérateur,
un pointeur "courant" ou qq chose que ça soit, parce que toutes les méthodes
parcourant la liste en ont besoin ? Non, on met une variable locale, pour
plusieurs raisons :
- un itérateur sur liste n'a de sens que pour les méthodes parcourant la
liste, pas pour la liste elle-même
- une instance constante ne pourra pas être parcourue (le curseur est
constant), pénible pour les passages par réf
- une instance n'utilisant pas de parcours (copie temporaire, par ex)
"gaspille" un attribut (donc de l'espace) pour rien
|
|
| Back to top |
|
 |
Hamiral Guest
|
Posted: Thu Apr 15, 2004 6:55 pm Post subject: Re: efficacité d'une var. ou d'un attribut |
|
|
Le Thu, 15 Apr 2004 20:23:54 +0200, Alexandre a écrit :
| Quote: | snip
est ce que ça apporte quelque chose de grapiller de l'espace memoire en
termes de vitesse d'execution de cette fonction??
Du dérisoire, je suppose. Opinion personnelle déjà donnée, coder selon
la sémantique et laisser popol optimiser.
surtout que <mode citation on> Une optimisation précose est la source de
tous les mots <mode citation off
|
désolé :)
--
Hamiral
|
|
| Back to top |
|
 |
Pierre Maurette Guest
|
Posted: Thu Apr 15, 2004 7:53 pm Post subject: Re: efficacité d'une var. ou d'un attribut |
|
|
Fabien LE LEZ <gramster (AT) gramster (DOT) com> typa:
| Quote: | On Thu, 15 Apr 2004 15:00:53 +0200, Pierre Maurette
[email]maurette.pierre (AT) free (DOT) fr[/email]> wrote:
int main() {
Pas de return ?
Non, le return dans main() est implicite.
Tiens, y'avait aussi celui-là. Je préfère mettre un return, dans tous |
les cas mais surtout quand main() renvoie "légalement" un int. Mais
peu importe...
Celui qui me génait, c'est celui de f() dans:
<code>
struct A {
int f(int y) {
int x; // On peut le mettre en attribut pour comparer.
x = y + 1;
x = x * x;
x = x + y;
}
};
</code>
La norme ($6.6.3) parle clairement d'un "undefined behavior in a
value-returning function".
C'est même plus grave que ce à quoi je m'attendais (une undefined
valeur de retour).
En fait, si la fonction retourne dans un registre, pas trop de
problème. Le "undefined behavior" concerne peut-être les cas où la
fonction retournerait dans la pile -> déséquilibre d'icelle.
Chez moi, deux compilateurs sur trois acceptent le code.
Pierre
|
|
| Back to top |
|
 |
Matthieu Moy Guest
|
Posted: Thu Apr 15, 2004 8:30 pm Post subject: Re: efficacité d'une var. ou d'un attribut |
|
|
Pierre Maurette <maurette.pierre (AT) free (DOT) fr> writes:
| Quote: | Tiens, y'avait aussi celui-là. Je préfère mettre un return, dans tous
les cas mais surtout quand main() renvoie "légalement" un int. Mais
peu importe...
Celui qui me génait, c'est celui de f() dans:
|
Oups ! Au passage, ça explique pourquoi l'optimiseur arrivait à faire
du code aussi rapide ...
--
Matthieu
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Apr 16, 2004 8:11 am Post subject: Re: efficacité d'une var. ou d'un attribut |
|
|
Pierre Maurette <maurette.pierre (AT) free (DOT) fr> wrote
| Quote: | Fabien LE LEZ <gramster (AT) gramster (DOT) com> typa:
On Thu, 15 Apr 2004 15:00:53 +0200, Pierre Maurette
[email]maurette.pierre (AT) free (DOT) fr[/email]> wrote:
int main() {
Pas de return ?
Non, le return dans main() est implicite.
Tiens, y'avait aussi celui-là. Je préfère mettre un return, dans tous
les cas mais surtout quand main() renvoie "légalement" un int.
|
Main renvoie toujours légalement un int. (Quand il retourne. On peut
très bien concevoir des programmes où main ne retourne jamais.) Et moi
aussi, je le trouve de très mauvais style de l'omettre.
| Quote: | Mais > peu importe...
Celui qui me génait, c'est celui de f() dans:
|
À toi aussi:-).
| Quote: | code
struct A {
int f(int y) {
int x; // On peut le mettre en attribut pour comparer.
x = y + 1;
x = x * x;
x = x + y;
}
};
/code
La norme ($6.6.3) parle clairement d'un "undefined behavior in a
value-returning function".
C'est même plus grave que ce à quoi je m'attendais (une undefined
valeur de retour).
|
La norme prévoit le cas général, où la valeur de retour pourrait aussi
avoir un type avec un destructeur ou des constructeurs non
triviaux. Elle prévoit aussi des implémentations sur des architectures
« bizarre », où peut-être il faut allouer de l'espace pour la valeur de
retour (même int) d'une façon particulière. Sur une implémentation
courante, sur une architecture habituelle, la seule chose que tu
risques, c'est effectivement une valeur indéfinie. Pour un int -- pour
d'autres types, tu pourrais bien avoir des comportements particuliers
(core dump, etc.).
En revanche, ce qui se passe ici, c'est que le code n'utilise jamais la
valeur calculée dans x. Et que c'est rélativement facile au compilateur
de le detecter, et de supprimer complétement tout le contenu de la
fonction. Ce qui pourrait expliquer pourquoi la version optimisée est
tellement plus rapide que la version non optimisée.
| Quote: | En fait, si la fonction retourne dans un registre, pas trop de
problème. Le "undefined behavior" concerne peut-être les cas où la
fonction retournerait dans la pile -> déséquilibre d'icelle.
|
Tout à fait.
| Quote: | Chez moi, deux compilateurs sur trois acceptent le code.
|
Pourquoi pas ? C'est légal, à condition de ne jamais appeler la
fonction.
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Alexandre Guest
|
Posted: Fri Apr 16, 2004 5:42 pm Post subject: Re: efficacité d'une var. ou d'un attribut |
|
|
"Hamiral" <Hamiral (AT) hamham (DOT) fr> a écrit dans le message de
news:pan.2004.04.15.18.55.41.351781 (AT) hamham (DOT) fr...
| Quote: | Le Thu, 15 Apr 2004 20:23:54 +0200, Alexandre a écrit :
snip
est ce que ça apporte quelque chose de grapiller de l'espace memoire
en
termes de vitesse d'execution de cette fonction??
Du dérisoire, je suppose. Opinion personnelle déjà donnée, coder selon
la sémantique et laisser popol optimiser.
surtout que <mode citation on> Une optimisation précose est la source de
tous les mots <mode citation off
mode capello on> maux, pas mots
désolé :)
--
Hamiral
|
oopss.... mille excuses à tous, et principalement à Maitre Capello Himself
quand je pense que je passe une partie de mes cours à râler après mes
étudiants à cause de leurs fautes d'orthographe... J'espère qu'ils ne
fréquentent pas ce forum ;-)
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Fri Apr 16, 2004 10:09 pm Post subject: Re: efficacité d'une var. ou d'un attribut |
|
|
On Fri, 16 Apr 2004 19:42:12 +0200, "Alexandre"
<alex.g (AT) netcourrier (DOT) com> wrote:
| Quote: | surtout que <mode citation on> Une optimisation précose est la source de
tous les mots
oopss.... mille excuses à tous, et principalement à Maitre Capello Himself
|
Tu me déçois, là. T'aurais quand même pu trouver une pirouette pour
t'en sortir, au lieu de bêtement avouer que tu as fait une faute
d'orthographe...
--
FLL, Epagneul Breton
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|