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 :

Typage statique et fonction


Sujet :

C++

  1. #21
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Citation Envoyé par qlt654 Voir le message
    Non modifiable, mais programme multitâches. Il y a donc un risque qu'une tâche appelle la fabrique juste après une autre, modifiant ainsi la valeur pointée pour les deux.
    Je ne comprends pas exactement ce que tu veux dire...si l'objet est non-modifiable (ce que tu pourrais assurer avec un type de retour du style const & Type) le problème des modifications concurrentes ne se pose pas. Concernant l'instanciation de l'instance, si elle est unique et que c'est une donnée membre de la fabrique comme te le suggère koala01, elle sera créée avant que la fonction puisse être appelée, donc pas de problème de concurrence d'appel à la fonction qui la renvoie (par référence const & IObjet dans ce cas).
    La gestion de la durée d'existence est alors simple: tu crée la fabrique dans ta main, par exemple, puis tu la transmets par référence. Fin de main, sortie de scope, nettoyage automatique.
    Si tu veux plusieurs instances parce que pramètres de construction différents, qu'est-ce qui t'interdit new + smart-pointer, exactement (pas plus coûteux en mémoire qu'une instance temporaire sur la pile...sauf que la pile est généralement plus petite que la heap) ?

  2. #22
    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 : 50
    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
    Par défaut
    Généralement, pas d'allocation dynamique veut dire recherche d'un temps réel dur. Il y a des moyens pour contourner cette contrainte :
    - Pendant la phase d'initialisation du ton programme, tu te moques souvent du temps réel, c'est pendant qu'il tourne que ça compte. Ne peux-tu pas créer dynamiquement tout ce dont tu as besoin pendant cette phase ?
    - Variante du précédent, tu peux t'allouer des blocs de mémoire brute pendant cette phase, puis créer des objets dedans à la demande et en temps déterministe, car tu sais ce que tu fais dans ce bloc.
    - Autre variante, quand la durée de vie de tes objets correspond bien à la durée d'exécution de tes fonction : Tu crées ces objets sur la pile
    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.

  3. #23
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    Grosso modo, à part la propreté, qu'est-ce qui t'embête à utiliser des variables globales ?
    J'ai plusieurs thread qui vont avoir besoin de plusieurs objets du même type (mais différent). Le nombre d'objet n'est pas connu, la durée d'utilisation non plus.
    Durant une exécution du programme, la fabrique créera plusieurs (dizaines de) milliers d'objets, pour 3types différents.



    Citation Envoyé par koala01 Voir le message
    Soit tu créer une variable membre de la classe qui te permettra d'avoir plusieurs instances de l'objet, mais qui obligera la fabrique à exister au minimum jusqu'à la dernière utilisation du pointeur ou de la référence.
    La fabrique existera jusqu'à la fin de la vie du programme.
    Le problème c'est que je ne maitrise pas le nombre d'objet dont je pourrais avoir besoin.




    Citation Envoyé par therwald Voir le message
    si l'objet est non-modifiable (ce que tu pourrais assurer avec un type de retour du style const & Type) le problème des modifications concurrentes ne se pose pas.
    Si ma fabrique utilise un attribut A pour stocker l'objet fraichement créé, et qu'elle renvoie &A, même sans const l’utilisateur ne pourra pas le modifier (pas de setter publique).

    Le problème c'est que si un autre (ou le même) utilisateur rappelle la fabrique pour créer un nouvel objet du même type,
    - soit la fabrique restocke dans A l'objet nouvellement créé (et du coup modifie l'objet que le premier utilisateur avait récupéré avec &A)
    - soit la fabrique possède une autre variable de stockage (dans ce cas il m'en faudrait des 10aine de millier)


    Citation Envoyé par therwald Voir le message
    Si tu veux plusieurs instances parce que pramètres de construction différents, qu'est-ce qui t'interdit new + smart-pointer, exactement (pas plus coûteux en mémoire qu'une instance temporaire sur la pile...sauf que la pile est généralement plus petite que la heap) ?
    Citation Envoyé par JolyLoic Voir le message
    Généralement, pas d'allocation dynamique veut dire recherche d'un temps réel dur.
    Temps réel mou ici. Pour mon cas c'est une instruction que j'ai, relative à un éventuel besoin d'utiliser le programme sur un support avec une mémoire très limitée.
    Je vais essayer d'avoir plus de précision sur les contours de cette restriction.

  4. #24
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par qlt654 Voir le message
    La fabrique existera jusqu'à la fin de la vie du programme.
    Le problème c'est que je ne maitrise pas le nombre d'objet dont je pourrais avoir besoin.
    Le nombre d'objet n'a absolument rien à faire dans l'histoire: ce qui importe, c'est de savoir quand chaque objet doit être détruit

    Que ton objet soit "maintenu" par la fabrique le temps que tu as besoin de l'objet ou que tu crées un tableau qui contient des pointeurs vers les différents objets (polymorphes) qui ont été créés, tu peux en avoir "autant que tu veux", cela ne posera aucun problème

    Par contre, pour éviter les fuites mémoire et les tentatives d'accès à un pointeur qui aurait été invalidé, ce qu'il faut impérativement, c'est savoir quand la mémoire allouée à l'objet doit être libérée

    Après, à partir du moment où tu as un objet par thread, que tu aies 1, 5 ou 150 threads, tu auras le nombre d'objets correspondant
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #25
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Par défaut
    Dans la cas d'objets statiques, leurs destructions interviendraient uniquement à la fin du scope.
    Donc, dans le cas ou je choisirais de stocker les objets dans des attributs de la fabrique, à la fin de la fabrique.

    Il faut donc, si je choisis cette solution (qui me semble, sans allocation dynamique la plus viable) que je détermine le nombre de d'objet dont j'ai besoin en simultané, et la durée de persistance donc j'ai besoin.

    ça va me demander un petit peu d'étude, mais je pense que j'y vois beaucoup plus clair sur la nature même de mon problème :

    Sans fabrique :
    • Les objets doivent être instanciés (statiquement) dans les contextes
    • Dans les contextes, je sais combien d'objets j'ai besoin et sur quelle persistance
    • Cela implique que les contextes aient la connaissance de la structure de la famille d'objet (ce que j'aurais voulu éviter)


    Avec une fabrique :
    • Les objets doivent être instanciés (statiquement) dans la fabrique
    • Depuis la fabrique, il est délicat de prévoir combien d'attribut de stockage d'objet je dois avoir
    • La fabrique permet aux contextes de ne connaitre que l'interface de la famille d'objet


    Je pense qu'en poussant un peu plus la conception des contextes, j'aurais une plus grande visibilité et je devrais pouvoir trouver un compromis viable.

    En tout cas, merci à tous pour votre aide.
    La conclusion : l'instanciation dynamique c'est quand même vachement sympa

  6. #26
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    tu peux très bien avoir un vector de pointeurs dans les contextes, et utiliser une factory "allouante".

  7. #27
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Citation Envoyé par qlt654 Voir le message
    Temps réel mou ici. Pour mon cas c'est une instruction que j'ai, relative à un éventuel besoin d'utiliser le programme sur un support avec une mémoire très limitée.
    Je vais essayer d'avoir plus de précision sur les contours de cette restriction.
    Si le problème c'est uniquement la taille de la mémoire, ce n'est pas un vraiement un problème de real-time, non?
    Le coût d'un [smart]-pointer n'est pas nul, mais pas extravagant non plus, j'imagine? De plus une référence coût la même chose qu'un pointeur à priori?

  8. #28
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2013
    Messages : 12
    Par défaut
    Citation Envoyé par therwald Voir le message
    Si le problème c'est uniquement la taille de la mémoire, ce n'est pas un vraiement un problème de real-time, non?
    Le coût d'un [smart]-pointer n'est pas nul, mais pas extravagant non plus, j'imagine? De plus une référence coût la même chose qu'un pointeur à priori?
    Le risque a priori c'est d'avoir un dépassement de mémoire en cours d'exécution, ou plutôt de ne pas être capable de garantir que ça n'arrivera pas.

  9. #29
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Citation Envoyé par qlt654 Voir le message
    Le risque a priori c'est d'avoir un dépassement de mémoire en cours d'exécution, ou plutôt de ne pas être capable de garantir que ça n'arrivera pas.
    Mais ça peut arriver sur la pile aussi, donc finalement c'est pas seulement une question de dynamique vs statique, c'est plutôt qu'il faut savoir combien d'objets on utilisera simultanément au max, et trouver un moyen de borner strictement ce nombre. Après la question dynamique vs statique devient secondaire, non?

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/11/2013, 16h41
  2. Appel statique de fonction
    Par thetux dans le forum C++
    Réponses: 13
    Dernier message: 11/08/2009, 13h03
  3. [AS2] Pb accès fonctions statiques
    Par wwave dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 08/02/2006, 14h18
  4. [MFC] Pointeur this et fonctions statiques
    Par Yellowmat dans le forum MFC
    Réponses: 5
    Dernier message: 08/02/2005, 10h15

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