Recherche…


Introduction

Le compilateur GNU propose différents niveaux d'optimisation pour le processus de compilation. Ces optimisations sont utilisées pour améliorer les performances du code et / ou la taille du code. La compilation d'un code avec optimisations prend généralement plus de temps.

Cette commande vous indique quelles optimisations sont disponibles sur votre système: $ gcc -Q --help = optimisations

Voici une documentation détaillée des options pour contrôler les optimisations:

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Differnce entre codes compilés avec O0 et O3

J'ai écrit un simple code C foo.c

int main()
{
    int i = 0;
    int j = 0;
    for (i = 0; i < 5; i++) {
            j = i + 1;
    }
    return 0;
}

Lorsque compilé avec -O0 c'est-à-dire en désactivant toutes les optimisations du compilateur

$ gcc -o foo.S foo.c -O0 -S

J'ai eu ceci:

    .file   "foo.c"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16 
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $0, -4(%rbp)
    movl    $0, -8(%rbp)
    movl    $0, -4(%rbp)
    jmp     .L2
.L3:
    movl    -4(%rbp), %eax
    addl    $1, %eax
    movl    %eax, -8(%rbp)
    addl    $1, -4(%rbp)
.L2:
    cmpl    $4, -4(%rbp)
    jle     .L3 
    movl    $0, %eax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (GNU) 6.2.0"
    .section        .note.GNU-stack,"",@progbits

GCC a pris toute la peine pour convertir mon code en langage de montage verbatim.

Mais quand j'ai compilé mon code avec O3, c'est-à-dire avec le plus haut niveau d'optimisation

J'ai eu ceci:

.file   "foo.c"
.section        .text.startup,"ax",@progbits
.p2align 4,,15
.globl  main
.type   main, @function
main:
.LFB11:
    .cfi_startproc
    xorl    %eax, %eax
    ret
    .cfi_endproc
.LFE11:
    .size   main, .-main
    .ident  "GCC: (GNU) 6.2.0"
    .section        .note.GNU-stack,"",@progbits

GCC a compris que je ne faisais que griffonner et ne faisais rien d’important avec les variables et la boucle. Donc, il m'a laissé un bout blanc sans code.

DAYUM!



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow