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.