IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Remplacer des compteurs statiques par des compteurs dynamiques


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut Remplacer des compteurs statiques par des compteurs dynamiques
    Bonjour tout le monde!

    Dans le but de nettoyer mon code, je souhaite supprimer tous mes compteurs statiques par des compteurs dynamiques.

    Voici un exemple de ce qui est fait actuellement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MyClass::MyClass() : m_count(_myStaticCount++)
    {
    }
    Je ne vois pas d'autres solutions que ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MyClass::MyClass(unsigned int count) : m_count(count)
    {
    }
     
    //le paramètre count est incrémenté ultérieurement
    Existe-t-il des méthodes plus "intelligente" pour éviter la redéfinition de mes constructeurs?

    Merci d'avance.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Je ne comprend pas tout à fait le problème posé par un compteur statique.

    Pour un compteur dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MyClass::MyClass(unsigned int & count) : m_count(count++)
    {
    }
    Sinon, je ne vois pas trop comment faire.

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Merci pour ta réponse.

    Le problème est que je vais devoir parallélisé le code dans un futur plus ou moins proche et j'ai vu sur divers forum qu'il est fortement déconseillé d'avoir des variables statiques.

  4. #4
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Les compteurs statiques sont très bien, hein.

    Après, si tu as plusieurs classes, il est possible de réunir comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    template <typename T> struct counted {
       static unsigned int count;
       unsigned int id;
       counted() : id(count++) { }
    };
    template <typename T> unsigned int counted::counter = 0;
     
    // ...
     
    struct S : counted<S> {
       // counter auto-defini et auto-incremente
       // id auto-defini
    };
    [Edit (ce n'est pas bien de ne pas actualiser la page avant de répondre)]

    Sinon, pour paralléliser, une variable statique doit être gérée comme une globale : lorsque plusieurs accès en parallèle se font sur la variable, ils doivent absolument tous être uniquement des lectures. Toute écriture doit se faire par un seul thread à la fois.
    Donc tant que tu ne créées pas d'objet compté dans ton code parallèle, tout va bien. Si tu en créées, il y a de toute façon un problème de conception. Et si il n'y a pas de problème de conception, il reste les mutex pour éviter tout souci.

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Merci pour ta réponse.
    J'ai effectivement un gros problème de conception...
    Par contre pour ta structure counted, si je crée un objet S dans chaque thread, il ne risque pas d'y avoir de problèmes?

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    A quoi te servent tes compteurs ? Si tu veux comptabiliser toutes les instances de tous les threads, il va bien te falloir avoir un compteur partagé. Le garder static dans ce cas là ne me semble pas idiot, par contre il va falloir faire attention au moment de l'incrémenter. Ta plateforme possède probablement des fonctions d'incrémentation qui sont atomiques (par exemple InterlockedIncrement sous windows). Si tu travailles avec un compilateur très récent, tu dois aussi pouvoir déclarer ton compteur comme un atomic<int>. Ou dans le pire des cas, recourir à des mutex, sections critiques... mais dans ce cas, ce n'est probablement pas optimal.

    Si tu veux compter le nombre d'instances thread par thread, je te conseille de regarder du côté du thread local storage. Là encore en utilisant des spécificités de ta plateforme, ou alors avec un compilateur über récent (en fait aucun que je connaisse actuellement...) avec le mot clef thread_local.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Merci pour ta réponse.
    J'ai repris ce code, il y a quelques mois et je ne suis pas certain de la porté/utilité des différents compteurs.

    Je suis quasiment certain que la pluspart d'entre eux servent à identifier cet objet dans le but de l'imprimer dans le résultat final.
    Dans ce cas, si je comprends bien, il faudrait que j'utilise une atomic<int> ou InterlockedIncrement suivant la plateforme.
    Cependant, je pense utilisais MPI lors de la parallélisation du code, je pense qu'il doit bien y avoir des routines pour ce genre de cas.

    Merci pour tout

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Identifier ou ordonner les objets entre eux?

    S'il faut juste les identifier, l'adresse en mémoire est unique pour chaque objet, donc pas besoin d'un compteur pour avoir un identifiant.

    Pour les ordonner, on peut mettre dans chaque classe un numéro "d'apparition" comme tu fais avec ton compteur, mais on peut aussi imaginer une liste statique de pointeur ?
    Dans ce cas, là, il suffirait d'une méthode statique pour parcourir l'ensemble des classes dans l'ordre plutôt que de devoir demander à chaque classe son numéro.

  9. #9
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Identifier ou ordonner les objets entre eux?

    S'il faut juste les identifier, l'adresse en mémoire est unique pour chaque objet, donc pas besoin d'un compteur pour avoir un identifiant.
    Attention, pas forcément !
    Si il utilise MPI, il me semble qu'il y a plusieurs processus diférents.
    Donc, selon le bon vouloir de l'OS, il est parfaitement possible que deux objets de deux processus différents se superposent en mémoire !

    Pour les ordonner, on peut mettre dans chaque classe un numéro "d'apparition" comme tu fais avec ton compteur, mais on peut aussi imaginer une liste statique de pointeur ?
    Dans ce cas, là, il suffirait d'une méthode statique pour parcourir l'ensemble des classes dans l'ordre plutôt que de devoir demander à chaque classe son numéro.
    Sauf qu'on se retrouve avec le même souci d'une variable statique en multi-thread.

Discussions similaires

  1. [Toutes versions] Remplacement de plusieurs occurrences par des compteurs
    Par Scypio dans le forum VBA Word
    Réponses: 1
    Dernier message: 16/01/2014, 13h27
  2. Séparer des lignes identiques par un compteurs
    Par Misspatate dans le forum SAS Base
    Réponses: 0
    Dernier message: 14/06/2011, 15h11
  3. Réponses: 5
    Dernier message: 13/12/2006, 16h08
  4. Remplacer les retour chariot par des <br/>
    Par novices dans le forum Langage
    Réponses: 1
    Dernier message: 21/08/2006, 21h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo