Retourner au contenu associé (entrée de forum : probleme de compréhension sur l'alignement.)
Posté par ninis666 le 12 septembre 2019 à 16:51. En réponse au message probleme de compréhension sur l'alignement.. É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) !
AltStyle によって変換されたページ (->オリジナル) / アドレス: モード: デフォルト 音声ブラウザ ルビ付き 配色反転 文字拡大 モバイル
# À cause des accès aligné par les instructions en asm
Posté par ninis666 . En réponse au message probleme de compréhension sur l'alignement.. É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 :
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) !