OVH Cloud OVH Cloud

membre static dans une fonction

14 réponses
Avatar
Michaël Delva
Bonjour à tous,

j'ai une fonction dans laquelle j'ai ce membre:

int nbre_boutons_joueurs = Box_Joueurs->ControlCount;

qui me donne le nombre de boutons dans un contrôle.

Or, pendant toute l'utilisation du programme, ce nombre ne change pas...

La fonction qui utilise ce membre est appellé assez souvent, et je me
demandais s'il était judicieux (ou bien si c'est comme ça qu'on fait) de
mettre ce membre static, de telle sorte qu'il ne soit calculé qu'une seule
fois lors du premier appel à la fonction...

Vous en pensez quoi?

Merci d'avance

10 réponses

1 2
Avatar
Fabien LE LEZ
On 06 Jul 2004 22:31:06 GMT, "Michaël Delva"
:

j'ai une fonction dans laquelle j'ai ce membre:


Uh ? Une variable peut être membre d'une classe, mais pas d'une
fonction, si je ne m'abuse :-/

int nbre_boutons_joueurs = Box_Joueurs->ControlCount;

La fonction qui utilise ce membre est appellé assez souvent, et je me
demandais s'il était judicieux (ou bien si c'est comme ça qu'on fait) de
mettre ce membre static, de telle sorte qu'il ne soit calculé qu'une seule
fois lors du premier appel à la fonction...


Bof... Il n'y a pas de calcul à proprement parler, il n'y a qu'une
indirection (le "Box_Joueurs->") et l'affectation d'un entier. AMHA,
ça ne vaut pas le coup.

Mais bon, il est quasiment impossible de savoir a priori ce qu'une
tentative d'optimisation donnera en termes d'optimisation réelle.
Donc, écris ton programme avec une sémantique qui reflète ce que tu
cherches à faire (par exemple, ne mettre "static" que si ça a un sens
réel), sans te préoccuper d'optimiser. L'optimisation ne vient
qu'après lecture des résultats du profiler, i.e. une fois que ton
programme a été compilé.

--
schtroumpf schtroumpf
Jean-Emile de France

Avatar
Michaël Delva
Uh ? Une variable peut être membre d'une classe, mais pas d'une
fonction, si je ne m'abuse :-/


Encore et toujours ces problèmes de vocabulaire... ;-) C'est dur quand on
ne vient pas d'une filière info d'employer tous les termes corrects!

Bof... Il n'y a pas de calcul à proprement parler, il n'y a qu'une
indirection (le "Box_Joueurs->") et l'affectation d'un entier. AMHA,
ça ne vaut pas le coup.

Mais bon, il est quasiment impossible de savoir a priori ce qu'une
tentative d'optimisation donnera en termes d'optimisation réelle.
Donc, écris ton programme avec une sémantique qui reflète ce que tu
cherches à faire (par exemple, ne mettre "static" que si ça a un sens
réel), sans te préoccuper d'optimiser. L'optimisation ne vient
qu'après lecture des résultats du profiler, i.e. une fois que ton
programme a été compilé.



Disons que ce n'est pas par souci d'optimisation, mais par souci de coder
"propre". Il me semblait que c'était intéressant de faire comme ça... Ou du
moins comme ça qu'il faille faire...

Merci de ta réponse!

Avatar
Alain Naigeon
"Michaël Delva" a écrit dans le message
news:


Disons que ce n'est pas par souci d'optimisation, mais par souci de coder
"propre". Il me semblait que c'était intéressant de faire comme ça... Ou
du

moins comme ça qu'il faille faire...


Je mets mon grain de sel, sous la surveillance de Fabien : si c'est dans la
nature de cette donnée d'être unique pour tous les objets de la classe,
alors, oui, il me semble que la clarté conceptuelle y gagne beaucoup
si tu en faits un membre static - AMHA ce serait même le cas si c'était
plus long ;) (et de toute façon on parle là de durées totalement sans
impact pratique)

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

Avatar
Fabien LE LEZ
On 06 Jul 2004 23:50:39 GMT, "Michaël Delva"
:

Uh ? Une variable peut être membre d'une classe, mais pas d'une
fonction, si je ne m'abuse :-/


Encore et toujours ces problèmes de vocabulaire... ;-) C'est dur quand on
ne vient pas d'une filière info d'employer tous les termes corrects!


Bof... Je n'ai jamais eu de problèmes avec ça (sauf parfois dans les
histoires de francisation de mots), et pourtant je viens d'une filière
"maths pures".


--
schtroumpf schtroumpf
Jean-Emile de France


Avatar
Fabien LE LEZ
On Wed, 7 Jul 2004 01:57:43 +0200, "Alain Naigeon" :

si c'est dans la
nature de cette donnée d'être unique pour tous les objets de la classe,


... et s'il s'agit bien d'un membre d'une classe (ce que je n'ai pas
vraiment saisi dans le message original).

Reprenons la ligne d'origine :

int nbre_boutons_joueurs = Box_Joueurs->ControlCount;

Sans indications supplémentaires, je supposerai le cas qui me paraît
canonique, i.e. cette ligne fait partie d'une fonction libre.

Déjà, un premier truc bizarre : on accède directement à une variable
membre d'un objet -- membre non statique apparemment puisqu'on y
accède via une instance de la classe.

Ensuite, il faut reconnaître qu'on manque cruellement de données :
d'où sort ce "Box_Joueurs" ?

A première vue, je dirais que si "Box_Joueurs" est un pointeur static
sur un objet const, i.e. est déclaré
static ClasseQuelconque const *Box_Joueurs;
ou si "ControlCount" est un membre static const de la classe dont
"Box_Joueurs" est une instance, alors "nbre_boutons_joueurs" peut être
static const.
Dans le cas contraire, en particulier si "Box_Joueurs" est un
paramètre de la fonction en question, déclarer "nbre_boutons_joueurs"
static me semble une mauvaise idée.
Et je ne vois pas de cas où "nbre_boutons_joueurs" peut être déclaré
static non-const.


--
schtroumpf schtroumpf
Jean-Emile de France

Avatar
Michaël Delva
Bof... Je n'ai jamais eu de problèmes avec ça (sauf parfois dans les
histoires de francisation de mots), et pourtant je viens d'une filière
"maths pures".




Il me reste plus qu'à faire un gros effort là dessus alors... ;-)

Avatar
Michaël Delva
Fabien LE LEZ wrote in
news::

On Wed, 7 Jul 2004 01:57:43 +0200, "Alain Naigeon" :

si c'est dans la
nature de cette donnée d'être unique pour tous les objets de la classe,


... et s'il s'agit bien d'un membre d'une classe (ce que je n'ai pas
vraiment saisi dans le message original).


En fait Box_Joueurs est un GroupBox appartenant à une fenêtre Windows,
représentée par une classe dans Builder 6 (TSaveData)

Et ControlCount renvoie le nombre de contrôles contenus par ce GroupBox.

Quand au code, en voilà un petit morceau:


void __fastcall TSaveData::Modifier_Caption_Joueurs()
{
int nbre_boutons_joueurs = Box_Joueurs->ControlCount,
offset = 0;

for (int i=0; i < nbre_boutons_joueurs; i++)
....
}


Avatar
Alexandre
bonjour,

En fait Box_Joueurs est un GroupBox appartenant à une fenêtre Windows,
représentée par une classe dans Builder 6 (TSaveData)

Et ControlCount renvoie le nombre de contrôles contenus par ce GroupBox.


je ne vois pas vraiment l'interet que la variable soit static.
En fait je ne vois pas non plus l'interet de cette variable... éviter
d'écrire Box_Joueurs->ControlCount ?
AMA tu laisses comme c'est .



Quand au code, en voilà un petit morceau:


void __fastcall TSaveData::Modifier_Caption_Joueurs()
{
int nbre_boutons_joueurs = Box_Joueurs->ControlCount,
offset = 0;

for (int i=0; i < nbre_boutons_joueurs; i++)
....
}


Avatar
Michaël Delva
je ne vois pas vraiment l'interet que la variable soit static.


Ben c'est ce que je me suis dit au fil du post ;-)

En fait je ne vois pas non plus l'interet de cette variable... éviter
d'écrire Box_Joueurs->ControlCount ?
AMA tu laisses comme c'est .


Comme j'utilise plusieurs fois cette variable, ça évite de la recalculer à
chaque fois... (notamment dans la boucle for)

Avatar
Fabien LE LEZ
On 07 Jul 2004 11:08:15 GMT, "Michaël Delva"
:

int nbre_boutons_joueurs = Box_Joueurs->ControlCount,
offset = 0;


Houlà ! Mauvaise idée AMHA.

Je préfère de loin

int nbre_boutons_joueurs = Box_Joueurs->ControlCount;
int offset = 0;


--
schtroumpf schtroumpf
Jean-Emile de France

1 2