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 :

GCC et l'alignement d'une structure


Sujet :

C++

  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut GCC et l'alignement d'une structure
    Bonjour.
    Je cherche à faire un alignement sur 16 d'une structure. Sous Visual cela marche bien mais pas sous gcc. Pour cela j'utilise cette macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #if defined(_MSC_VER)
        #define DATA_ALIGN_16(declaration)          __declspec(align(16))           declaration
    #else
        #define DATA_ALIGN_16(declaration) declaration __attribute__ ((aligned (16)))
    #endif
    Mais lorsque je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DATA_ALIGN_16( maStrutcure  s);
    Sous visual s est bien aligné. Sous Gcc non.
    Normalement __attribute__ ((aligned (16))) est sensé être l'équivalent de __declspec(align(16)).


    Si quelqu'un à une idée (un option de compilation?)

  2. #2
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    J avais un peu de temps a perdre j ai fait un test (dsl ma VM de test est US).

    il semblerait que ca ne marche, avec gcc, qu'a la definition, pas a la declaration :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include <stdio.h>
    #if defined(_MSC_VER)
        #define DATA_ALIGN_16(declaration)          __declspec(align(16))           declaration
    #else
        #define DATA_ALIGN_16(declaration) declaration __attribute__ ((aligned (16)))
    #endif
     
    struct maStrutcure{ 
    int q;
    char f[ 12];
    short s;};
     
    struct maStrutcure2{ 
    int q;
    char f[ 12];
    short s;} __attribute__ ((aligned (16)));
     
    typedef struct _maStrutcure3{ 
    int q;
    char f[ 12];
    short s;} maStrutcure3;
     
    typedef struct _maStrutcure4{ 
    int q;
    char f[ 12];
    short s;} maStrutcure4 __attribute__ ((aligned (16)));
     
    typedef struct __attribute__ ((aligned (16))) _maStrutcure5{ 
    int q;
    char f[ 12];
    short s;} maStrutcure5 ;
     
    int main()
    {
      DATA_ALIGN_16( struct maStrutcure  s);
      printf (" maStrutcure : %d\n", sizeof(s));
      struct maStrutcure  sbis __attribute__ ((aligned (16)));
      printf (" maStrutcure1bis : %d\n", sizeof(sbis));
      struct maStrutcure2  s2;
      printf (" maStrutcure2 : %d\n", sizeof(s2));
      DATA_ALIGN_16( maStrutcure3  s3);
      printf (" maStrutcure3 : %d\n", sizeof(s3));
      maStrutcure4  s4;
      printf (" maStrutcure4 : %d\n", sizeof(s4));
      DATA_ALIGN_16( maStrutcure4  s4bis);
      printf (" maStrutcure4bis : %d\n", sizeof(s4bis));
      maStrutcure5  s5;
      printf (" maStrutcure5 : %d\n", sizeof(s5));
    }
    il n'y a que 2 et 5 aui retournent 32 les autresm c'est 20.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Je parle d'alignement mémoire de la structure. i.e l’adresse de la structure sera aligné sur 16.

  4. #4
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    Citation Envoyé par yan Voir le message
    Je parle d'alignement mémoire de la structure. i.e l’adresse de la structure sera aligné sur 16.


    Dans mon exemple toutes les adresses de structure sont du style 0x12345670
    Donc, correctement alignées.
    Je suis avec gcc 4.5.1 (Fedora 14 x86)

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Merci pour l'aide.
    j'ai repris ton code pour afficher les pointeur
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include <stdio.h>
    #if defined(_MSC_VER)
        #define DATA_ALIGN_16(declaration)          __declspec(align(16))           declaration
    #else
        #define DATA_ALIGN_16(declaration) declaration __attribute__ ((aligned (16)))
    #endif
     
    struct maStrutcure{ 
    int q;
    char f[ 12];
    short s;};
     
    struct maStrutcure2{ 
    int q;
    char f[ 12];
    short s;} __attribute__ ((aligned (16)));
     
    typedef struct _maStrutcure3{ 
    int q;
    char f[ 12];
    short s;} maStrutcure3;
     
    typedef struct _maStrutcure4{ 
    int q;
    char f[ 12];
    short s;} maStrutcure4 __attribute__ ((aligned (16)));
     
    typedef struct __attribute__ ((aligned (16))) _maStrutcure5{ 
    int q;
    char f[ 12];
    short s;} maStrutcure5 ;
     
    int main()
    {
      DATA_ALIGN_16( struct maStrutcure  s);
      printf (" maStrutcure : %d\n", &s);
      struct maStrutcure  sbis __attribute__ ((aligned (16)));
      printf (" maStrutcure1bis : %d\n", &sbis);
      struct maStrutcure2  s2;
      printf (" maStrutcure2 : %d\n", &s2);
      DATA_ALIGN_16( maStrutcure3  s3);
      printf (" maStrutcure3 : %d\n", &s3);
      maStrutcure4  s4;
      printf (" maStrutcure4 : %d\n", &s4);
      DATA_ALIGN_16( maStrutcure4  s4bis);
      printf (" maStrutcure4bis : %d\n", &s4bis);
      maStrutcure5  s5;
      printf (" maStrutcure5 : %d\n", &s5);
    }
    et sous migw - g++ 4.5.2 et gcc version 4.4.5 (Debian 4.4.5-8 64 bits) ca ne marche pô

    je compile avec

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Iran

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Points : 40
    Points
    40
    Par défaut
    structures déclarées sur la stack n'a pas pu être aligné. vous pouvez définir puis global, ou static.

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/10/2014, 18h53
  2. champs de bits dans une structure - option de gcc pour bon fonctionnement
    Par matdakillah dans le forum RedHat / CentOS / Fedora
    Réponses: 1
    Dernier message: 08/10/2008, 12h44
  3. alignement parasite dans une structure !
    Par - Robby - dans le forum C
    Réponses: 4
    Dernier message: 23/03/2006, 23h02
  4. [toFAQ][socket] Envoi d'une structure
    Par julien20vt dans le forum C++
    Réponses: 15
    Dernier message: 23/04/2003, 15h47
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 18h31

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