Zoeken…


Invoering

De GNU-compiler biedt verschillende optimalisatieniveaus voor het compilatieproces. Deze optimalisaties worden gebruikt om de codeprestaties en / of codegrootte te verbeteren. Het compileren van een code met optimalisaties aan, duurt meestal langer om te voltooien.

Deze opdracht vertelt u welke optimalisaties beschikbaar zijn op uw systeem: $ gcc -Q --help = optimalisaties

Hier is een gedetailleerde documentatie van opties om optimalisaties te beheren:

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

Verschil tussen codes gecompileerd met O0 en O3

Ik schreef een eenvoudige C-code foo.c

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

Wanneer gecompileerd met -O0, dwz door alle optimalisatie van de compiler uit te schakelen

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

Ik heb dit:

    .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 deed al het mogelijke om mijn code letterlijk in assembler te converteren.

Maar toen ik mijn code compileerde met O3, dat wil zeggen met het hoogste niveau van optimalisaties

Ik heb dit:

.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 begreep dat ik gewoon doodling was en niets belangrijks deed met de variabelen en de lus. Dus het liet me een lege stub achter zonder code.

Dayum!



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow