Buscar..


Introducción

El compilador GNU ofrece varios niveles de optimizaciones para el proceso de compilación. Estas optimizaciones se utilizan para mejorar el rendimiento del código y / o el tamaño del código. La compilación de un código con optimizaciones activadas, por lo general toma más tiempo en completarse.

Este comando le dice qué optimizaciones están disponibles en su sistema: $ gcc -Q --help = optimizaciones

Aquí hay una documentación detallada de las opciones para controlar las optimizaciones:

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

Diferencia entre códigos compilados con O0 y O3.

Escribí un código C simple foo.c

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

Cuando se compila con -O0, es decir, deshabilita todas las optimizaciones del compilador

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

Tengo esto:

    .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 se tomó la molestia de convertir mi código en lenguaje ensamblador literalmente.

Pero cuando compilé mi código con O3, es decir, con el nivel más alto de optimizaciones

Tengo esto:

.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 entendió que solo estaba garabateando y sin hacer nada importante con las variables y el bucle. Así que me dejó un trozo en blanco sin código.

DAYUM!



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow