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 :

structure : valeur ou adresse, efficacité


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Par défaut structure : valeur ou adresse, efficacité
    Salut,

    Dans des procédures prenant en argument des structures que l'on veut accéder en lecture, quel est l'usage :

    void proc1(struct type_struct ma_struct);
    void proc2(struct type_struct *ma_struct);
    void proc3(const struct type_struct *ma_struct);


    Je dirais que proc3 est meilleure ? Sémantiquement l'objet pointé par ma_struct est intouchable, contrairement à dans proc2(). Je dirais que proc3 est également plus efficace que proc1() qui fait, lors de chaque appel, une copie membre à membre d'une structure vers une autre... ce que je pense est plus lent.


    J'ai raison, j'ai tord ? Il y a autre chose ?


    Merci
    A bientot

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je pense exactement comme toi. Une structure se passe par adresse et pas par valeur. Si on ne doit pas la modifier (parce que cela n'a pas de sens pour la fonction appelée), on rajoute le mot clé const.

    Donc oui : proc3
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Disons que ça dépend de ce que tu veux rendre constant. Trois solutions possibles :

    1) Seul l'objet pointé doit être constant (= en lecture seule) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void proc3(struct type_struct const * ma_struct);
    Cette écriture autorise à modifier le pointeur.

    2) Seul le pointeur doit être constant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void proc3(struct type_struct * const ma_struct);
    Cette écriture autorise à modifier les membres de la structure.

    3) Le pointeur et l'objet pointé doivent être constants tous les deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void proc3(struct type_struct const * const ma_struct);
    ============

    D'une manière générale, const rend constant ce qui se trouve juste avant lui.
    S'il se trouve au tout début (ce qui est autorisé), il a la même signification que s'il se trouvait juste après le type. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void proc3(const struct type_struct * ma_struct);
    correspond à la même chose que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void proc3(struct type_struct const * ma_struct);

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 472
    Par défaut
    Citation Envoyé par Heimdall Voir le message
    Je dirais que proc3 est meilleure ? Sémantiquement l'objet pointé par ma_struct est intouchable, contrairement à dans proc2(). Je dirais que proc3 est également plus efficace que proc1() qui fait, lors de chaque appel, une copie membre à membre d'une structure vers une autre... ce que je pense est plus lent.
    Si tu cherches à établir des règles de codage à l'échelle d'un projet entier, tu peux effectivement suivre ce principe. La pile est un espace essentiel, limité, et rarement protégé contre les débordements. Les règles de bon usage incitent donc à en faire un usage le plus sobre possible, sans compter le coûts en cycles de copies incessantes de grands blocs de données. Donc, dans le doute : proc3().

    Maintenant, si c'est l'optimisation que tu recherches, il faut bien retenir que cela ne va devenir intéressant qu'à partir du moment où la structure aura une certaine taille. Si ta structure est aussi grosse que le pointeur, ça ne vaut pas le coup.

    Si elle est plus grosse de quelques octets, ce n'est pas forcément très intéressant non plus, car il faudra de toutes façons faire, au niveau du code, une étape supplémentaire pour déréférencer le pointeur. Sur un PC, ça n'a pas beaucoup d'importance, mais dans l'embarqué ou la programmation de micro-contrôleurs, l'espace dédié au code est souvent aussi restreint que celui consacré à la pile… et n'est jamais libéré !

    Enfin, il faudra tenir compte du fait que ton pointeur peut être NULL, ou invalide d'une manière générale. Et ça, c'est à ta fonction de le contrôler. L'avantage, dans ce cas, d'un passage direct par valeur est de garantir la lisibilité du contenu de la structure. Ça n'empêche pas ses membres d'être éventuellement incorrects eux-aussi, mais tu retires quand même une segfault potentielle et des étapes de maintenance.

  5. #5
    Membre confirmé
    Homme Profil pro
    Collégien
    Inscrit en
    Mars 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Mars 2003
    Messages : 192
    Par défaut
    Merci pour ces réponses utiles et précises :-)

Discussions similaires

  1. fonction passage par valeur ,par adresse
    Par hybride11 dans le forum C
    Réponses: 2
    Dernier message: 21/08/2010, 18h25
  2. adressage par valeur par adress..
    Par hanou88 dans le forum C
    Réponses: 2
    Dernier message: 27/12/2009, 02h38
  3. Réponses: 15
    Dernier message: 30/09/2008, 23h36
  4. Passage d'arguments par valeur et adresse
    Par ToutEnMasm dans le forum C++
    Réponses: 12
    Dernier message: 04/10/2007, 09h32
  5. conversion valeur hexadecimal / adresse mémoire
    Par saturne13 dans le forum C
    Réponses: 10
    Dernier message: 04/02/2007, 20h15

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