Suche…


Einführung

Der GNU-Compiler bietet verschiedene Optimierungsstufen für den Kompilierungsprozess. Diese Optimierungen werden verwendet, um die Codeleistung und / oder die Codegröße zu verbessern. Das Kompilieren eines Codes mit aktivierten Optimierungen dauert in der Regel länger.

Dieser Befehl gibt an, welche Optimierungen auf Ihrem System verfügbar sind: $ gcc -Q --help = Optimierungen

Hier ist eine ausführliche Dokumentation der Optionen zur Steuerung von Optimierungen:

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

Unterscheidung zwischen mit O0 und O3 kompilierten Codes

Ich habe einen einfachen C-Code foo.c geschrieben

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

Beim Kompilieren mit -O0, dh durch Deaktivieren aller Compiler-Optimierungen

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

Ich habe das bekommen:

    .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 hat sich die Mühe gemacht, meinen Code wörtlich in Assemblersprache zu konvertieren.

Aber als ich meinen Code mit O3 kompiliert habe, dh mit den höchsten Optimierungen

Ich habe das bekommen:

.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 verstand, dass ich nur kritzelte und nichts Wichtiges mit den Variablen und der Schleife machte. So blieb mir ein leerer Stich ohne Code.

DAYUM!



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow