C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

efficacité d'une var. ou d'un attribut

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Chat
Guest





PostPosted: Thu Apr 15, 2004 8:35 am    Post subject: efficacité d'une var. ou d'un attribut Reply with 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??
merci
Back to top
Matthieu Moy
Guest





PostPosted: Thu Apr 15, 2004 8:42 am    Post subject: Re: efficacité d'une var. ou d'un attribut Reply with quote



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





PostPosted: Thu Apr 15, 2004 8:57 am    Post subject: Re: efficacité d'une var. ou d'un attribut Reply with quote



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





PostPosted: Thu Apr 15, 2004 9:54 am    Post subject: Re: efficacité d'une var. ou d'un attribut Reply with quote

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





PostPosted: Thu Apr 15, 2004 9:54 am    Post subject: Re: efficacité d'une var. ou d'un attribut Reply with quote

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





PostPosted: Thu Apr 15, 2004 10:55 am    Post subject: Re: efficacité d'une var. ou d'un attribut Reply with quote

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





PostPosted: Thu Apr 15, 2004 1:00 pm    Post subject: Re: efficacité d'une var. ou d'un attribut Reply with quote

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





PostPosted: Thu Apr 15, 2004 6:21 pm    Post subject: Re: efficacité d'une var. ou d'un attribut Reply with quote

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.

--
Wink
FLL, Epagneul Breton

Back to top
Alexandre
Guest





PostPosted: Thu Apr 15, 2004 6:23 pm    Post subject: Re: efficacité d'une var. ou d'un attribut Reply with quote

<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





PostPosted: Thu Apr 15, 2004 6:55 pm    Post subject: Re: efficacité d'une var. ou d'un attribut Reply with quote

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





PostPosted: Thu Apr 15, 2004 7:53 pm    Post subject: Re: efficacité d'une var. ou d'un attribut Reply with quote

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





PostPosted: Thu Apr 15, 2004 8:30 pm    Post subject: Re: efficacité d'une var. ou d'un attribut Reply with quote

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





PostPosted: Fri Apr 16, 2004 8:11 am    Post subject: Re: efficacité d'une var. ou d'un attribut Reply with quote

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





PostPosted: Fri Apr 16, 2004 5:42 pm    Post subject: Re: efficacité d'une var. ou d'un attribut Reply with quote


"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
Wink
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





PostPosted: Fri Apr 16, 2004 10:09 pm    Post subject: Re: efficacité d'une var. ou d'un attribut Reply with quote

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...

--
Wink
FLL, Epagneul Breton

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.