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 :

[Conception] Partage d'objets VS Références à un objet unique


Sujet :

C++

  1. #21
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Herb Sutter s'attaque maintenant (avec sa communauté) au problème de cette discussion, donc il va ya bientot y avoir une guideline officielle :

    http://herbsutter.com/2012/01/20/got...ifficulty-310/

  2. #22
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    @jblecanard Implémenter plusieurs solutions ?
    Hum…
    Oui, pourquoi pas, après tout.
    C'est sûr que ça va prendre du temps, mais décider quelle solution avant de commencer à implémenter quoi que ce soit en prendra également.
    Je vais voir ce que ça donne…

    @Klaim Oh, il lisent les messages de ce forum ?
    Cool…

    Plus sérieusement, merci pour le lien.
    Je regarderai ça en détails lorsque j'aurai du temps.

  3. #23
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    Salut,

    Perso, j'utilise une collection de shared_ptr avec des map au niveau d'un méta objet et des shared_ptr quasiment partout (sauf pour les cas où un objet possède un sous objet).

    Dans ton cas:
    - pour les variables et constantes
    => des map dans programme avec des accesseurs prenant les clefs (des strings) comme paramètre et renvoyant les variables et constantes correspondantes

    - pour la classe littéral
    => une collection de shared_ptr de termes avec une méthode add_argument qui prend un shared_ptr<terme> :
    lorsque l'on ajoute un terme constant ou variable, on utilise les accesseurs de la classe programme,
    lorsque l'on ajoute un terme entier, on utilise directement un make_shared<Entier>(valeur) (pour moi, les entiers devraient être crées "à la volée", sauf si tu as 10000 fois le même entier référencé et des problèmes de mémoire)

    Remarque:
    + Si un littéral n'a de sens qu'au sein d'une règle, alors collection de std::unique_ptr dans règle,
    + S'il peuvent être partagé entre plusieurs règles au sein d'un même programme et qu'il y a moyen de les identifier par une clef alors map de clef, shared_ptr de littéral dans programme

    Cette remarque s'applique également à la classe règle

    - pour la classe règle
    => une collection de weak_ptr (ou de pointeurs nus) de variables (mais si on utilise des shared, cela ne change rien fonctionnellement)
    => pour les littéraux cf ci dessus

    - pour les symboles de fonction
    => une map dans programme avec comme clef le nom de fonction


    Cette approche peut être pénalisante si tu crées et détruit énormément de règles et qu'au bout d'un moment, tu te retrouves avec des variables qui ne servaient que pour les premières règles crées et qui ne sont donc plus que référencées par programme. Si tu es dans ce cas, il faudra mettre en place une politique de "nettoyage" du programme supprimant tout les shared_ptr dont unique renvoie true.
    Après il faut voir le compromis à trouver suivant les cas d'utilisation du programme: préfères-tu avoir une faible consommation mémoire (i.e. nettoyer fréquemment ton programme) quitte à reconstruire des variables après coup ou pas?

    Enfin théoriquement (i.e. en utilisant normalement un programme) tu ne devrais pas avoir de "sac de nœuds" qui créerait des cycles. Après rien n'empêche un utilisateur de créer une variable dont le terme substitut est la variable elle même...

  4. #24
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Merci CedricMocquillon, on va dire que c'est l'intention qui compte…

    Au risque de me répéter, le problème de stockage se pose juste pour les classes « Entier », « Prédicat » et « Symbole de fonction ».
    Pour ce qui est des « Termes fonctionnels », je peux apporter une petite précision par rapport à mon dernier message.
    Un « Terme fonctionnel » est utilisé par un (et un seul) « Littéral », et sa durée de vie ne dépasse pas celle du « Littéral » qui l'utilise.
    Donc finalement, je pense que l'on peut dire que les « Termes fonctionnels » ont pour propriétaire les « Littéraux ».


    Citation Envoyé par CedricMocquillon Voir le message
    (pour moi, les entiers devraient être crées "à la volée", sauf si tu as 10000 fois le même entier référencé et des problèmes de mémoire)
    Évidemment que les « Entiers » sont créés à la volée.
    Mais durant une exécution, certains peuvent êtres utilisés puis inutilisés plusieurs fois.
    Les garder en mémoire permettrait d'éviter de les recréer.


    Citation Envoyé par CedricMocquillon Voir le message
    - pour les symboles de fonction
    => une map dans programme avec comme clef le nom de fonction
    J'ai déjà expliqué ce qui me dérangeait avec cette solution.
    Si tu n'expliques pas ce qui motive ce choix, il ne m'est d'aucune valeur.
    Entre parenthèses, le nom d'un symbole de fonction ne suffit pas à l'identifier…

    Citation Envoyé par CedricMocquillon Voir le message
    Après il faut voir le compromis à trouver suivant les cas d'utilisation du programme: préfères-tu avoir une faible consommation mémoire (i.e. nettoyer fréquemment ton programme) quitte à reconstruire des variables après coup ou pas?
    Ce ne sont pas les variables qui seront reconstruites, mais la consommation mémoire peut être une ressource critique, en effet.
    Ceci dit, dans mon cas je crois bien que la durée d'exécution est encore plus critique.

    Citation Envoyé par CedricMocquillon Voir le message
    Après rien n'empêche un utilisateur de créer une variable dont le terme substitut est la variable elle même...
    Normalement, cela ne devrait pas être possible.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/12/2010, 15h50
  2. Réponses: 5
    Dernier message: 28/04/2010, 14h54
  3. [JACOB] Comment passer un objet par référence à une méthode
    Par zlavock dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 21/03/2005, 18h28
  4. Réponses: 8
    Dernier message: 26/08/2004, 18h59

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