Forum Linux.général probleme de compréhension sur l'alignement.

Posté par . Licence CC By‐SA.
Étiquettes : aucune
0
12
sept.
2019

bonjour à tous,

voila si j'ai

struct A{
 int m_value ;
 char c;
}
struct B{
 int m_value;
 char c;
}__attribute__((packed))

B aura une taille de 5 octets alors que la structure de A aura une taille de 8 octets. Le compilateur rajoute des octets de padding mais pourquoi?

sur un pc 64 bits, le bus de donné et de 128 bits, donc on peut recupérer a chaque coup d'horloge jusqu'a 16 octets de mémoire. Donc si mon processus a besoin de récupérer la valeur de m_value quel est l'interet
d'ajouter des octets de padding. ca ne va rien changer car je peux lire facilement mon octets avec ou sans padding.

Merci d'avance pour votre aide

  • # À cause des accès aligné par les instructions en asm

    Posté par . Évalué à 4. Dernière modification le 12 septembre 2019 à 16:54.

    En demandant à gcc de générer l'assembleur d'un truc qui itère sur des tableaux de A ou B, tu verras pourquoi :

    struct A {
     int m_value;
     char c;
    };
    struct B{
     int m_value;
     char c;
    } __attribute__((packed));
    void foo(struct A *a, int size)
    {
     int i;
     for (i = 0 ; i < size ; i++) {
     a[i].c = 66;
     a[i].m_value = 5555;
     }
    }
    void bar(struct B *b, int size)
    {
     int i;
     for (i = 0 ; i < size ; i++) {
     b[i].c = 66;
     b[i].m_value = 5555;
     }
    }
    gcc -O0 -S prout.c -o prout.s
    foo:
    .LFB0:
     .cfi_startproc
     pushq %rbp
     .cfi_def_cfa_offset 16
     .cfi_offset 6, -16
     movq %rsp, %rbp
     .cfi_def_cfa_register 6
     movq %rdi, -24(%rbp)
     movl %esi, -28(%rbp)
     movl $0, -4(%rbp)
     jmp .L2
    .L3:
     movl -4(%rbp), %eax
     cltq
     leaq 0(,%rax,8), %rdx
     movq -24(%rbp), %rax
     addq %rdx, %rax
     movb $66, 4(%rax)
     movl -4(%rbp), %eax
     cltq
     leaq 0(,%rax,8), %rdx
     movq -24(%rbp), %rax
     addq %rdx, %rax
     movl $5555, (%rax)
     addl $1, -4(%rbp)
    .L2:
     movl -4(%rbp), %eax
     cmpl -28(%rbp), %eax
     jl .L3
     nop
     popq %rbp
     .cfi_def_cfa 7, 8
     ret
     .cfi_endproc
    .LFE0:
     .size foo, .-foo
     .globl bar
     .type bar, @function
    bar:
    .LFB1:
     .cfi_startproc
     pushq %rbp
     .cfi_def_cfa_offset 16
     .cfi_offset 6, -16
     movq %rsp, %rbp
     .cfi_def_cfa_register 6
     movq %rdi, -24(%rbp)
     movl %esi, -28(%rbp)
     movl $0, -4(%rbp)
     jmp .L5
    .L6:
     movl -4(%rbp), %eax
     movslq %eax, %rdx
     movq %rdx, %rax
     salq $2, %rax
     addq %rax, %rdx
     movq -24(%rbp), %rax
     addq %rdx, %rax
     movb $66, 4(%rax)
     movl -4(%rbp), %eax
     movslq %eax, %rdx
     movq %rdx, %rax
     salq $2, %rax
     addq %rax, %rdx
     movq -24(%rbp), %rax
     addq %rdx, %rax
     movl $5555, (%rax)
     addl $1, -4(%rbp)
    .L5:
     movl -4(%rbp), %eax
     cmpl -28(%rbp), %eax
     jl .L6
     nop
     popq %rbp
     .cfi_def_cfa 7, 8
     ret

    C'est pourquoi il faut aligner correctement les champs des structures ou de n'utiliser les attributs d'alignement que si on n'a pas le choix ...

    De mon temps, c'était plus facile de lire l'assembleur produit par gcc, (c'était du 32 bits) !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.