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 :

Class Matrix : pointeur ou vector pour le stockage des données


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par défaut Class Matrix : pointeur ou vector pour le stockage des données
    Salut à tous,

    je me pose une question concernant la création d'une classe Matrix en c++. Du point de vue des performances, est il préférable d'utiliser un pointeur ou un vector pour le stockage des données ? Et bien sur quelle en est la raison ?

    Je sais que le sujet de la class Matrix est largement documenté mais je n'est pas trouvé de réponse à cette question puisqu'on trouve régulièrement les deux constructions.

    Merci d'avance pour vos réponses

  2. #2
    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
    c'est pas un "pointeur", mais un tableau.
    Si ta matrice est d'une taille connue à la compilation (et donc fixe), tu peux opter pour le tableau.
    Si ce n'est pas le cas, tu auras besoin d'un vector.

    Par ailleurs, nous avons deux articles sur les matrices dans notre FAQ, (dans fonctions > opérateurs)
    Elles seront à minima un bon rappel.

    L'idée est d'avoir une interface uniquement basée sur operator(), pour pouvoir masquer ces détails internes.

  3. #3
    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
    D'un point de vue perfs, il est fortement recommandé d'utiliser une des libs déjà disponible comme p.ex. Eigen.

    Après, avec le vecteur, tu paieras une 0-initialisation non nécessaire.
    De fait, un tableau dynamique sera plus pertinent pour des raisons de perfs. Mais cela implique soit de passer par un unique_ptr<T[]> (syntaxe non garantie) et d'écrire copie et affectation, soit d'utiliser un tableau dynamique à la main, ce qui implique de se palucher à la main les 5 opérations qui vont bien (copie, affectation, déplacement (constructeur et opérateur), et destructeur).

    Le vecteur est très bien pour le premier TD d'écriture d'une matrice, ou pour du code de production qui n'a pas des besoins micro-optimisés côté perfs. Et surtout c'est très bien pour avoir du code robuste. Le débutant tend à ne pas savoir ce qu'il doit écrire, quand, ni comment en termes de copies -- et oui, les réponses sont dans la FAQ.
    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...

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par défaut
    Bonjour leternel et merci pour ta réponse,

    je vais préciser un peu ma question. Est il plus performant de

    -> Définir un pointeur membre d'une classe Matrix contenant les données de la matrice

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Dans le .hpp
    double *_data;
    Puis allouer dynamiquement la mémoire dans le constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Dans le .cpp
    _data = new double[_i*_j];     //Avec _i et _j les variables membres correspondant au nombre de ligne et au nombre de colonne
    -> Définir un vector membre d'une classe Matrix contenant les données de la matrice

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Dans le .hpp
    vector<double> _data;
    Puis utiliser la fonction resize dans le constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //Dans le .cpp
    _data.resize(_i*_j);

    Ma question ne concerne pas la déclaration de tableau statique ou encore la surcharge de l'opérateur operator().

    Désolé de ne pas m'être fait comprendre dès mon premier post.

  5. #5
    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
    Citation Envoyé par kipgon Voir le message
    Puis utiliser la fonction resize dans le constructeur
    ???
    La liste d'initialisation permet d'appeler le bon constructeur directement. Tu ne veux pas appeler resize() sur l'attribut d'un objet dans son constructeur.
    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...

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2013
    Messages : 113
    Par défaut
    Salut Luc Hermitte,

    j'ai poster ma réponse sans voir ton post.

    Je me doutais un peu que le tableau dynamique serait plus performant. Cela dit tu as raison si les performances sont recherchées autant utiliser un bibliothèque, je me posais cette question pour bien comprendre les choses.

    Qu'appelles tu une 0-initialisation ? Initialiser l'ensemble des données à 0 ? Si c'est le cas, n'est ce pas une bonne chose ? J'avoue que j'aurais tout de même initialisé mon tableau dynamique dans le constructeur .

    Par curiosité toujours, quelle sont les optimisations qui sont faites dans les bibliothèques ? Connaissez vous de la documentation sur cette question ?

  7. #7
    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
    La 0-initialisation peut être intéressante dans certains cas, mais quand on écrit A = M * N * V + C; il serait ridicule de payer une 0-initialisation sur chaque temporaire construit dans l'histoire.

    Pour les optims, la plus ancienne est l'élimination des temporaires par expression-template (c'est un mot clé, cf le vieux Blitz++). Avec le C++11 on a encore d'autres moyens pour éliminer des copies.

    Après, les bibliothèques dédiées vont parfois exploiter des optimisations plus bas niveau sur comment les boucles sont écrites, l'exploitation de spécificités des architectures, les multi-coeurs, etc. Les BLAS ont longtemps été la référence en FORTRAN. Le wiki d'Eigen me semble contenir pas mal d'infos sympas. (des benchs par là: http://eigen.tuxfamily.org/index.php?title=Benchmark)
    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...

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    Les optimisations dans l'absolu, c'est un non-sens.
    On optimise pour un mode d'utilisation.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 10/04/2015, 15h40
  2. 3 solutions pour le stockage des données
    Par loic20h28 dans le forum UML
    Réponses: 53
    Dernier message: 21/01/2009, 12h15
  3. Comparatif des SGBDR pour le stockage des BLOBs
    Par rnan dans le forum Décisions SGBD
    Réponses: 9
    Dernier message: 10/08/2007, 13h05
  4. question théorique sur le stockage des données
    Par jp_rennes dans le forum Administration
    Réponses: 1
    Dernier message: 18/09/2006, 18h28
  5. [HTML] Tableau pour l'enregistrement des données
    Par ghyosmik dans le forum Balisage (X)HTML et validation W3C
    Réponses: 13
    Dernier message: 01/11/2005, 15h28

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