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 :

dans quels cas les pointeur sont plus rapides ?


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 44
    Points : 23
    Points
    23
    Par défaut dans quels cas les pointeur sont plus rapides ?
    Bonjour !
    Je me pose souvent la question en programmant, si je déclare mon objet en tant que pointeur son exécution sera t elle plus rapide ?
    Dans quels faut il se passer des pointeurs ? et inversement ?

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Tu ne te poses pas la bonne question.
    On va utiliser des pointeurs selon de la sémantique de l'objet manipulé ou selon ce que l'on veut en faire à un instant donné.
    La performance n'entre pas dans l'équation qui va nous faire décider si l'on doit utiliser pointeur ou objet automatique -- du moins certainement pas dans un premier, ni même dans un second temps.
    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...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    merci mais est-ce que tu pourrais me détailler plus ?
    Je suis pas très calé sur le sujet

  4. #4
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Salut,
    la FAQ C++ est pas mal à ce propos, non ?
    http://c.developpez.com/faq/cpp/?pag...CE_utilisation

    En gros, c'est pas un problème de performance mais plutôt de ce que tu veux en faire. Les pointeurs permettent la valeur 0, l'allocation
    pour le reste les références suffisent. Sauf erreur de ma part. of course

  5. #5
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 711
    Points
    6 711
    Par défaut Re: dans quels cas les pointeur sont plus rapides ?
    Citation Envoyé par 180degrés
    Je me pose souvent la question en programmant, si je déclare mon objet en tant que pointeur son exécution sera t elle plus rapide ?
    Pour répondre strictement à ta 1ère question l'accès à un objet (au sens large, ie quelque chose) via un pointeur sur celui-ci (éventuellement 'déguisé' via une référence par &) est forcement plus long car il y a une lecture en plus pour traverser l'indirection.
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 44
    Points : 23
    Points
    23
    Par défaut
    ok merci pour vos réponses, je vais jeter un oeil a la faq aussi.

  7. #7
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Pour compléter, si tu dois passer un objet un peu volumineux en paramètre d'une fonction, le processus de recopie peut être couteux en temps et mémoire et tu peux avoir intérêt à passer une référence (éventuellement const) ou un pointeur sur l'objet (éventuellement const) pour l'éviter.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  8. #8
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 711
    Points
    6 711
    Par défaut
    absolument !

    Si on prend l'exemple des classes de la stl, la passage d'une string par valeur aura peu d'impact car la chaine interne n'est pas recopiée, il n'en est pas de même pour une list vect etc ... qui eux sont recopiés, ce qui peut avior de graves conséquences sur les temps d'exécution.
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  9. #9
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Si on prend l'exemple des classes de la stl, la passage d'une string par valeur aura peu d'impact car la chaine interne n'est pas recopiée
    cette affirmation a t-elle un rapport avec une implémentation possible des std::string avec un compteur de référence ?

    Si oui, il faudrait préciser le paragraphe du standard imposant cette implémentation. Je ne le connais pas en tout cas. Pour moi, le C++ n'impose pas cette exigence donc cette affirmation n'est pas juste.
    (sauf si tu me donnes le paragraphe évidement )[/code]

  10. #10
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Ce n'est effectivement pas juste.
    Voir l'implémentation de la SL de dinkumware qui semble avoir abandonné le COW (Copy on Write).

    De part la question originale, je pense que ce sont les bases qui sont à revoir.
    - objets pour lesquels ce qui est important c'est la valeur => entités mathématiques (entiers, vecteurs, matrices, ...), chaine de caractères, ... sémantique de valeur ; on s'intéresse essentiellement à la valeur de la variable. Deux données de valeurs différentes sont intrinsèquement différentes.
    - variables (entités) pour lesquels on s'interresse plus à leur identité, leur état pouvant changer tandis qu'ils continuent d'être la même entité. Typiquement les objets issus d'une hiérarchie, et qui seront manipulés par référence ((smart-)pointeurs) sémantique de référence.

    Après, les pointeurs peuvent avoir un grand intérêt relativement aux durées de vie des objets. Typiquement, un objet qui devra survivre à la portée locale dans laquelle il est créé, gagne à vivre sur le tas. Pour justement éviter les copies ou déléguer le traitement de sa durée de vie à un gestionnaire (on pourrait très bien renvoyer un handle plutôt qu'un pointeur ici).

    Mais, si on regarde comment il est idéal de le manipuler, on peut vouloir plutôt faire abstraction de la gestion de son état, et manipuler un objet de plus haut niveau par valeur. Genre une matrice ou une chaine de caractères. Le prix des copies est un détail plus ou moins complexe à régler quand il se pose.
    (Blitz++ avait défini plusieurs types de matrices afin de permettre une sémantique de déplacement en sortie de fonction. Avec le futur C++0x, on aura peut-être un nouveau moyen pour définir un type unique supportant la sémantique de déplacement en plus de la sémantique de valeur.
    Une bonne alternative pour éviter de payer le prix du COW.)

    Soit : on a quelque chose d'hybride. L'objet est manipulé directement (sémantique de valeur) et vit sur la pile, mais son état interne est géré via un pointeur (et donc vit sur le tas). (Evidemment, cette approche n'a aucun sens pour des objets qui ont véritablement une sémantique de référence)


    Et évidemment, les pointeurs sont incontournables pour mettre en oeuvre des structures de données de haut niveau (vecteurs, listes, tables associatives, arbres, ...)

    Je ne pense pas avoir été exhaustif. C'est juste une petite recette simplifiée, si ce n'est simpliste. Je sais que j'emploie des mots peu communs, mais ils correspondent à des principes clés qui sont vraiment importants dans ce choix de pointeur ou non.

    Avec l'expérience, tu verras mieux où et quand utiliser les pointeurs.
    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...

  11. #11
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 711
    Points
    6 711
    Par défaut
    Citation Envoyé par Luc Hermitte
    Ce n'est effectivement pas juste.
    Voir l'implémentation de la SL de dinkumware qui semble avoir abandonné le COW (Copy on Write).
    C'est tout a fait regrétable, la recopie d'une string est chère car elle impose une allocation dans le tas (pour la 'vraie' chaine interne). Pour moi toute implémentation réalisant une recopie n'est tout simplement pas digne d'être distribuée

    Pour répondre à Hylvenir, C++ n'impose pas non plus que le calcul de 1+2 se fasse en moins d'un million d'années . . .

    Mais cela est dans l'air du temps, et le temps est au gachi de l'utilisation de la mémoire et du CPU, bref à Java
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  12. #12
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Le problème est que l'on paie le prix du COW pour tous les accès où il n'y en a pas besoin. Sans parler des locks MT là où on n'en a pas besoin non plus dès que l'on compilerait pour du MT.

    Bref, le retour de fonction est plus rapide en l'abscence de RVO efficace, mais les accès aux chaines plus couteux partout aileurs. Soit la majorité du temps.
    On a vu mieux comme optimisation.

    Ceci dit, ils utilisent un buffer pour les petites chaines, et il semblerait que cela soit efficace. Je n'ai pas fait de mesures personnellement.
    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...

  13. #13
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    C'est tout a fait regrétable, la recopie d'une string est chère car elle impose une allocation dans le tas (pour la 'vraie' chaine interne). Pour moi toute implémentation réalisant une recopie n'est tout simplement pas digne d'être distribuée
    J'ai l'impression qu'il y avait plus de bug ou de difficulté à mettre en oeuvre cette solution qu'une simple copie, visiblement les implémenteurs préférent abandonner ce chemin. Le passage par référence ou pointeur évite ce problème de création inutile. En plus, un compilateur 'inteligent' pourrait voir l'inutilité de la création et n'utiliser qu'une référence sans création d'une variable temporaire.

    Pour répondre à Hylvenir, C++ n'impose pas non plus que le calcul de 1+2 se fasse en moins d'un million d'années . . . Wink
    Je regarde dans le standard
    Le C++ impose dans sa bibliothèque pas mal de mimina requis pour les implémentations en tout cas.

    Mais cela est dans l'air du temps, et le temps est au gachi de l'utilisation de la mémoire et du CPU, bref à Java
    ça sent trop le troll ça je ne suis pas sur ce coup là.

    et tout ça sur une question de vitesse pointeur/référence... pas sûr que ça aide l'OP

Discussions similaires

  1. Dans quels pays les développeurs sont-ils les mieux payés ?
    Par Hinault Romaric dans le forum Actualités
    Réponses: 45
    Dernier message: 23/09/2014, 11h55
  2. Réponses: 19
    Dernier message: 16/09/2009, 08h41
  3. Réponses: 14
    Dernier message: 03/04/2008, 01h44
  4. Quand et dans quels cas utiliser les méthodes repaint() et validate()?
    Par kayzra dans le forum Interfaces Graphiques en Java
    Réponses: 14
    Dernier message: 02/08/2007, 15h46
  5. Réponses: 2
    Dernier message: 06/05/2007, 22h37

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