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 :

optimiser les structures vides


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut optimiser les structures vides
    Y'a-t-il des documents sur le sujet ?
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct vide {};
     
    struct MaStruct
    {
    int i_;
    vide v_;
    };
    Le sizeof(vide)==1, et sizeof(MaStruct)==5 voir 8 ou plus si on exige un alignement de mémoire.
    Ce n'est pas optimal, dans bien des cas on pourrait faire ce qui suit sans trop de problèmes pratiques (enfin, je crois...).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct MaStruct: vide
    {
    int i_;
    };
    L'avantage est que sizeof(MaStruct)==4 cette fois.
    Qu'en pensez-vous ?

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    La plus part des compilos n'augmenteront pas la taille de la structure si tu dérives d'une classe vide. (ça a un nom : empty base class optimization)
    Sa sert a pas mal de chose (les allocateurs sont basé sur ce principe).
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par Camboui
    Y'a-t-il des documents sur le sujet ?
    L'article fondateur :
    http://www.cantrip.org/emptyopt.html

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    En tant que membre, une instance ne peut avoir de taille nulle. Ne serait-ce que pour distinguer deux instances consécutives :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct vide{};
    struct conteneur
    {
    vide v1;
    vide v2;
    vide tab_v[10];
    };
    conteneur c;
    assert(&(c.v1)!=&(c.v2));
    assert(&tab_v[0]!=&tab_v[1]); // etc..
    En revanche, le compilateur optimise pour l'héritage. C'est un cas où on utilise un héritage privé à la place d'une composition.

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Donc c'est bien cela, les membres vides d'une structure prennent toujours de la place. Dériver la structure de ces classes vides est donc bien la solution pour éviter de perdre de la place.
    Dommage que les structures de la stl ne fassent pas ainsi, je pense surtout à std::string dont un des membres est l'allocateur standard std::allocator par défaut. Et std::allocator est vide. Je suppose qu'à l'époque on n'y avait pas penser...

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Bon, et maintenant qu'en est-il pour un passage en paramètre ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    struct vide
    {
     template<class T>
     void do(T const &) {}
    };
     
    struct encore_vide
    {
     template<class T>
     void do(T const & t)
     {
      std::cout << t << std::endl;
     }
    };
     
    template<class T, class V>
    void foo(T t, V v)<-- de la mémoire sur le stack pour v ?
    {
     ...
     v.do(t);
     ...
    }
     
    int main()
    {
     foo(33, vide());
     foo("trente-trois", encore_vide());
    }
    Est-ce que lors des appels de foo() dans main() il va y avoir de l'espace réservé sur le stack pour "vide" et "encore_vide" ?

  7. #7
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Donc c'est bien cela, les membres vides d'une structure prennent toujours de la place. Dériver la structure de ces classes vides est donc bien la solution pour éviter de perdre de la place.
    Oui parceque les membres ont besoin d'avoir des adresses mémoire séparées (donc avec au moins 1 byte de décalage) mais dans le cas de l'héritage l'abstraction fait qu'on peut utiliser la même adresse pour la classe de base vide et la classe enfant.
    En fait dés qu'on comprends les cas où on a besoin d'une adresse mémoire séparée, on déduit plus facilement où on peut perdre de la mémoire même avec des membres vides.

Discussions similaires

  1. Optimisation sur les méthodes vides ?
    Par ngryman dans le forum EDI/Outils
    Réponses: 3
    Dernier message: 30/09/2008, 16h21
  2. LIKE et les champs vide
    Par XioN dans le forum Bases de données
    Réponses: 4
    Dernier message: 09/08/2004, 16h24
  3. [String] comment virer tous les espaces vides ?
    Par Alec6 dans le forum Langage
    Réponses: 6
    Dernier message: 26/07/2004, 14h27
  4. Optimiser les tables
    Par blizar dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 04/06/2004, 08h34
  5. tri avec les champs vides en dernier
    Par r-zo dans le forum Requêtes
    Réponses: 11
    Dernier message: 03/09/2003, 13h40

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