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 :

question en venant de java


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 7
    Par défaut question en venant de java
    Quelque chose me dérange en C++ par rapport au Java. Je vois dans plein de tutoriaux des gens utiliser apparemment de manière indifférente:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     UnObjet obj;
     obj.faire;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      UnObjet *obj = new UnObjet();
      obj->faire;
    Ne faut-il pas toujours allouer dynamiquement un objet ?

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ne faut-il pas toujours allouer dynamiquement un objet ?
    Non.
    Et d'ailleurs quand tu utilises new, il faut aussi utiliser delete quelque part (ce qui pose des problèmes d'exception safety par exemple)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 7
    Par défaut
    comment savoir dans ce cas ?

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Non.

    Comment faire cours ... ?

    Toute donnée (j'ai pas dit "objet") en C++ peut être allouée sur la pile ou sur le tas (ou être globale, ...). Une donnée sur la pile sera toujours implicitement libérée, et détruite dans le cas d'un objet (*), en sortie de la portée de sa déclaration/construction. Une donnée vivant sur le tas dispose d'une durée de vie qui trascende la portée dans laquelle elle est née.

    Ca, ce sont les détails techniques. Une application immédiate est liée donc à la gestion des durées de vie, et à des aspects d'optimisation. En effet, pour faire qu'une donnée sur la pile vive hors de sa portée, il faut la copier en dehors de cette portée. Cela nécessite deux choses : d'abord qu'elle soit copiable, ensuite que cela ne coute pas trop cher (c'est l'aspect optimisation).


    "Etre copiable" ... Ca, c'est le détail sémantique qui fait toute la différence avec le Java. En Java, les données non natives ont toutes une sémantique d'entité. En C++, les données peuvent aussi avoir une sémantique de valeur (et quantité de sémantiques hybrides intermédiaires).

    Une valeur c'est quoi ? C'est une donnée où l'état définit l'"identité" -- je sais, ce n'est pas le bon mot: car on s'intéresse ici à l'égalité. i et j sont égaux s'il ont la même valeur. Typiquement c'est le cas de tout les types numériques et mathématiques (entier, vecteurs, matrices, ...), des chaînes de caractères, ...
    Sémantique de valeur suppose que la donnée est copiable et comparable.
    Les valeurs se régalent à vivre sur la pile.

    Et une entité alors ? On parle d'entité pour les données dont l'état peut changer et qui restent pourtant la même donnée. On peut avoir deux références vers une même entité (affecter l'entité au travers d'une référence l'affecte aussi via l'autre référence), et avoir deux entités qui ont le même état (des jumeaux).
    L'égalité ne nous intéresse que rarement dans les entités, on va plutôt comparer des sous-états qui les caractérisent -- au besoin.
    Elles ne sont pas faites pour être copiées. Au besoin (mais pas toujours), on les dupliquera par clonage -- Java a suivi le C++ là dessus.
    NB: Les objets tirés de hiérarchies polymorphes (héritage public) ont à 99% une sémantique d'entité ; leur forcer une sémantique de valeur requiert des cabrioles -- ce n'est pas un problème de langage, mais un problème OO AMHA.

    Les entités vivent très mal sur la pile. Toutes fois, en vu de RAII, quand il n'y a pas de polymorphisme en jeu on peut en déclarer sur la pile.


    Se sont deux cas extrêmes, limites scolaires -- quoique, plus de 80% (pifométriques) de mes classes rentrent dans une de ces deux catégories.
    A partir de là, il y a des recettes de cuisines sur ce qui doit etre défini et interdit dans chacun des deux cas.

    (*) ce truc est énorme, c'est le détail qui fait que gérer des ressources (mémoire comme pots de peintures) peut devenir très simple en C++ ; cherche RAII dans la FAQ.



    Pour en revenir à ta question, dans un vrai code, cela dépend. Dans les tutoriaux, a priori,
    - ils se posent rarement la question -> moit'-moit'
    - ils profitent du RAII -> pile
    - ils font dans le polymorphisme -> tas
    - ils définissent des objets mathématiques -> pile
    - ils optimisent des transferts de gros objets -> tas (c'est une pessimisation sur les petits)
    - ...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Une donnée vivant sur la pile dispose d'une durée de vie qui trascende la portée dans laquelle elle est née.
    Tu voulais pas plutôt dire :
    "Une donnée vivant sur le tas dispose d'une durée de vie qui transcende la portée dans laquelle est est née."
    ?

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Oui en effet. Définitivement. Merci. J'édite.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Question d'architecture en java
    Par ploxien dans le forum Langage
    Réponses: 4
    Dernier message: 30/11/2007, 13h30
  2. 2 questions sur l'API java
    Par ®om dans le forum Langage
    Réponses: 8
    Dernier message: 28/07/2006, 09h09
  3. Questions sur les compilateurs java
    Par irenee dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 30/05/2006, 10h42
  4. [Débutant] Question de cours de JAVA
    Par pinggu dans le forum Débuter avec Java
    Réponses: 17
    Dernier message: 17/05/2006, 15h09
  5. [Débutant] Questions de base sur java
    Par JajaY dans le forum Langage
    Réponses: 2
    Dernier message: 04/04/2006, 18h51

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