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 �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    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 Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    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).

  3. #3
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    D�tails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    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
    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 �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    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 �clair�
    Inscrit en
    Avril 2005
    Messages
    1 110
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    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
    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