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 :

intérêt des structures


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut intérêt des structures
    Bonjour à tous.

    Je n'utilise jamais les structures, je ne les aiment pas pour des raisons que je liste plus bas.

    Mais j'ai peut-etre bafoué une régle elementaire ; ne regarde pas le probleme sous le bon angle!?!?

    Pourriez vous me convaincre que les structures, ca n'est pas si mal que çà, voir indispensable dans certains cas?

    Quelques raisons pour lesquels je n'utilise jamais de structure :

    • Avec les structures c'est lent : on ne travaille que par recopie, jamais par référence. Du coup : copie de donnée + construction/destruction à gogo !
    • Les structures, ca bouffe de la ram inutilement : toujours pour la meme raison
    • On ne peut pas partager une instance de structure : avec une classe j'ai le choix de cloner ou pas l'objet; avec une structure tout le monde a son propre exemplaire. On nous apprends qu'il est dangereux de faire du copier/coller dans du code (premier paragraphe d'un quelconque chapitre sur l'heritage), et avec les structure tout n'est que copie copie copie...
    • Une structure n'est pas nullable : cela nous oblique à faire une instance statique qu'on appelle "Null" ou "Empty", encore de la ram consommée pour rien.

  2. #2
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour à toi.

    Les structures n'ont finalement qu'un seul avantage : elles sont légères. Pas d'allocation de mémoire (son espace est une partie de celui de son parent et a été alloué en même temps que dernier), donc pas d'intervention du GC, pas de déréférencement additionnel (si toto est une classe, lire toto.x nécessite d'aller chercher toto dans la mémoire, tandis que si toto est une structure ses données sont déjà dans l'espace de this, ou dans la pile pour une variable locale), pas de surcharge mémoire (toute instance de classe a un header de 12 octets alors qu'une structure n'a rien de tel), pas de compteur de références à modifier à chaque assignation, etc.

    De plus, certains des inconvénients que tu cites peuvent aussi être des avantages : ainsi le fait qu'une valeur soit recopiée. Pour certains algorithmes, c'est du pain béni. Si tu songes par exemple à un algo récursif qui examinerait tous les chemins d'un arbre et aurait, à chaque noeud, besoin de manipuler et modifier quelques vecteurs avant de les transmettre au noeud suivant. Quand par la suite l'algo sera amené à revenir aux noeuds précédents, les structures vecteurs transmis à ces noeuds n'auront pas été modifiés. Pour en faire autant avec des classes il aurait fallu, à chaque noeud, créer une nouvelle instance : un parcours d'un arbre relativement simple générerait ainsi des centaines de milliers d'instances, soit un fort stress pour le GC. Avec les structures, tout est resté dans la pile, un espace de taille fixe.

    Enfin, quelques remarques sur tes reproches :
    * Sur la consommation de ram, les structures ont plutôt un effet positif : une référence prend déjà 8 octets sur un processeur 64-bits et une structure est typiquement de la même taille (MS recommande les classes quand on excède 8 octets même si c'est plutôt une mauvaise règle : la taille compte fortement mais n'est pas le seul critère).
    * Copie de données à gogo, oui, mais c'est insignifiant. Et puisqu'il faut aussi copier les références, voir ma remarque précédente. Quant aux constructeurs, tu n'es pas toujours obligé de les appeler et ils sont typiquement légers et "inlinés".
    * J'ai montré que dans certains cas le passage par copie était un comportement intéressant.
    * Tout n'a pas besoin d'être nullable. Il est d'ailleurs regrettable qu'on ne puisse pas faire de classe non-nullable, c'est une reproche souvent adressé à C#.

    Pour conclure je dirais que les structures occupent une niche mais que, dans ces niches, elles peuvent être des atouts extrêmement précieux pour doper les performances, réduire la consommation mémoire ou améliorer le code. Et j'ajouterai qu'il ne faut surtout pas sous-estimer le coût de l'instanciation d'une classe, qui réclame un enregistrement dans les structures de données thread-safe du GC.

  3. #3
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    Une structure n'est pas nullable
    Il existe le type Nullable
    http://www.meziantou.com/c-nullable/

  4. #4
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    En complément de ce qui a été dit plus haut: prend le Datetime, ou Int32. Ce sont des objets immutable, et légers. S'il n'étaient que des types référence, comme en java, ca veut dire qu'une liste de 1000 int nécessiterait la création de 1000 objets, dont le GC devrait se charger. Alors que là, une List<int> de 1000 éléments contient directement ces éléments contigus en mémoire, ce qui diminue l'empreinte mémoire totale tout en améliorant les perfs de lecture et d'écriture. Et comme le dit DonQuiche, ils sont non nullable, ce qui fait des vérifications en moins dans le code à faire.

    Mais il est vrai qu'un dev .Net a rarement besoin de créer des structs. Les cas d'école sont les nombres complexes (du style a+ib, sur lesquels on surcharge les opérateurs courants *, +, -, ...), les clés composites (comme une paire de int, par exemple), les types "Money" (une paire decimal + enum ou string), ... En 5 ans de dev pro C#, j'ai du en écrire 3 ou 4 tout au plus

  5. #5
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Par défaut
    Merci pour vos réponses avisées.

    DonQuiche, tu m'a fortement troublé, ta réponse est vraiment très interressante

    J'ai besoin de relire tout ca pour bien l'assimiler meme si je pense avoir compris...
    Je reviendrai surement vous poser une ou deux questions sur le sujet apres avoir approfondi le sujet si vous etes ok.

    Sinon j'ai découvert (par hasard) une syntaxe qui m'etait inconnue jusqu'alors. Elle semble justement en rapport avec le sujet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {
         int? x;
        if(x.HasValue) /////
    }
    que fait ce "?" ?

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    int? = Nullable<int>
    C'est à dire un entier qui peut valoir null

  7. #7
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par giova_fr Voir le message
    DonQuiche, tu m'a fortement troublé


    Ma foi, si j'ai pu répondre à tes questionnements sur le sujet, tant mieux, content d'avoir pu t'être utile.

Discussions similaires

  1. Performances : intérêt des vues ?
    Par Mr N. dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/10/2005, 13h42
  2. Intérêt des TActionList
    Par Invité dans le forum C++Builder
    Réponses: 4
    Dernier message: 11/03/2005, 17h31
  3. [glut] de l'intérêt des listes
    Par khayyam90 dans le forum OpenGL
    Réponses: 3
    Dernier message: 26/07/2004, 10h35
  4. Quel est l'intérêt des Services Web ??
    Par silvermoon dans le forum Débats sur le développement - Le Best Of
    Réponses: 19
    Dernier message: 12/02/2003, 22h28
  5. [Technique] Intérêt des index
    Par ddams dans le forum Décisions SGBD
    Réponses: 10
    Dernier message: 04/11/2002, 15h11

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