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 :

Garanties sur l'alignement


Sujet :

C++

  1. #1
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut Garanties sur l'alignement
    Salut,

    Je sais que pour le moment, la manière dont les membres d'une structures sont alignées en C++ est implementation-defined.

    Mais j'ai parfois vu que le moteur 3D Irrlicht faisait du code comme ça :

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct vector3
    {
        float x;
        float y;
        float z;
     
        float const* get() const {
            return &x;
        }
    };

    Pour que leur vecteur 3D puisse à la fois être représenté comme un couple de flottants ou comme un tableau C (un avantage parfois, pour de la concision).

    Je me demande si la contiguité est ici garantie, vu qu'on a bien 3 membres consécutifs de même type ?

    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Oui, si j'ai bien interprété la norme.

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Hello,

    Il n'y a à priori aucune garantie (du moins de mémoire), maintenant sous Visual et gcc effectivement l'implémentation fait que les membres de 4 octets ou plus sont contigüs en mémoire. Donc à vérifier pour quel compilo ce code est prévu.

    Après, même si ce code fonctionne, je ne pense pas que l'imiter dans tes propres programmes soit une bonne idée. Quelque chose du genre :

    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
     
    class vector3
    {
     
    public:
     
        float getX() const { return p[0]; }
        float getY() const { return p[1]; }
        float getZ() const { return p[2]; }
     
        const float *const get() const { return p; }
     
        //Le constructeur et/ou les setters qui vont bien
        //....
     
    private:
     
        float p[3];
     
    };
    Fournira les mêmes servies et la même souplesse (voire plus puisque tu es moins dépendant de la manière de stocker les membres).

  4. #4
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Il faut s'entendre alors.

    Loufoque tu l'as trouvé sur quel partie de la norme ton paragraphe ?

    @bolhrak : on sait que c'est défini par l'implémentation quand les types sont mélangés. Ici on a trois du même type, et plusieurs posts trouvés ici et là sur google tendent à faire penser que quand les types sont homogènes, c'est contigü mais j'ai pas réussi à trouver des références valides vers la norme.

    Sinon pour ta remarque, une classe de vecteur géométrique est quand même un cas particulier.

    Les classes de vecteurs 2D/3D/4D ne sont pas des vraiment des classes au sens OO du terme, un peu comme std::pair, ce ne sont que des n-uplets tout simples, mais qui respectent certaines règles (addition, et tout). Elles sont quasiment tjrs conçues de la même manière.

    C'est clairement plus pratique et lisible d'écrire .x, .y, .z que des getters/setters, même réduits au minimum (x(), y(), z()).

    C'est juste que parfois les interfaces C prennent soit 3 valeurs distinctes, soit un tableau C.

    Après, la biblio CGAL fait avec des accesseurs, mais ils ont leurs raisons.

    J'avais aussi pensé à mettre le tableau privé, et mettre des références publiques qui s'appeleraient x, y, z pointant vers le bon endroit, mais après la taille de la structure devenait déraisonnablement grosse pour rien.

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    Par défaut
    Salut,

    La norme assure que, si tu copie un objet POD (avec memcpy) dans un tableau de char de taille égale à celle du POD, puis que tu recopie le tableau de "char" dans un objet POD, tu obtiendra exactement les memes valeurs pour les membres.

    Par contre, cela ne veut absolument pas dire que les membres successifs de mêmes types puissent être considérés comme contigus en mémoire...

    En outre, pour les objet non PODS, voici ce qu'on lit:
    Citation Envoyé par La norme 9.2 §11
    Nonstatic data members of a (non-union) class declared without an intervening access-specifier are allocated
    so that later members have higher addresses within a class object. The order of allocation of nonstatic
    data members separated by an access-specifier is unspecified (11.1). Implementation alignment requirements
    might cause two adjacent members not to be allocated immediately after each other; so might
    requirements for space for managing virtual functions (10.3) and virtual base classes (10.1).
    Autrement dit:

    Si tu as un indicateur d'acces (AKA public: private: protected: ), entre deux membres non statiques, l'alignement est au choix de l'implémentation.

    En outre, les obligation d'alignement existantes (et qui sont également dépendantes de l'implémentation ) font qu'il est tout à fait possible que deux membres de même type qui se suivent, sans être déclarés au sein d'un tableau, peuvent tout à fait ne pas utiliser des adresses contigues

    L'un dans l'autre, il semblerait que irrlicht prenne donc certains risques si l'on ne se réfère qu'à la norme, et sans préjuger du compilateur/ de la platteforme avec lequel/sur laquelle elle va tourner
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Oui, si j'ai bien interprété la norme.
    A mon avis il n'y a rien qui autorise a penser que c'est valide dans la
    norme actuelle. (Peut-etre dans le draft avec tout le jeu sur la
    redefinition des POD, mais c'est quelque chose encore en etat de flux.

    En pratique, je ne vois pas de raisons qui pousseraient un compilateur a ne
    pas placer les membres comme s'ils etaient dans un tableau. Par contre, je
    vois bien l'optimiseur decider que des alias sont impossibles dans ce cas
    et donc foutre le bordel dans des cas d'utilisation complexes qui va
    disparaitre des qu'on simplifie un peu le test case...

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    J'avais conclu une fois que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct
    {
        T valeur1;
        T valeur2;
        ...
        T valeurN;
    } valeurs;
    avait le même layout que

Discussions similaires

  1. [CR 2008] Besoin d' aide sur l 'alignement verticale
    Par hind25 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 13/01/2012, 07h01
  2. Questions sur l'alignement des adresses
    Par unomadh dans le forum C++
    Réponses: 4
    Dernier message: 21/07/2011, 16h34
  3. Question facile sur l' Alignement
    Par GLSpirit dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 10/09/2008, 15h01
  4. [HTML] Alignement d'un texte sur un tableau...
    Par gdawirs dans le forum Balisage (X)HTML et validation W3C
    Réponses: 14
    Dernier message: 21/11/2005, 14h08
  5. Aligner du texte à gauche et à droite sur une même ligne ?
    Par pontus21 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 12/04/2005, 11h25

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