2011-02-23 9 views
9

Como parte de responder a otra pregunta, quería mostrar que el nivel insano de optimización de gcc (-O3) básicamente eliminaría cualquier variable que no se usara en main. El código fue:¿El nivel de optimización de locura gcc (-O3) no es lo suficientemente insano?

#include <stdio.h> 
int main (void) { 
    char bing[71]; 
    int x = 7; 
    bing[0] = 11; 
    return 0; 
} 

y la salida fue gcc -O3:

.file "qq.c" 
    .text 
    .p2align 4,,15 
.globl main 
    .type main, @function 
main: 
    pushl %ebp 
    xorl %eax, %eax 
    movl %esp, %ebp 
    popl %ebp 
    ret 
    .size main, .-main 
    .ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3" 
    .section .note.GNU-stack,"",@progbits 

Ahora puede ver que es eliminado las variables locales, pero todavía hay un poco de desperdicio en ese país. Me parece que todo el:

sección
pushl %ebp 
    xorl %eax, %eax 
    movl %esp, %ebp 
    popl %ebp 
    ret 

podría ser sustituido por el más simple:

xorl %eax, %eax 
    ret 

¿Alguien tiene alguna idea de por qué gcc no lleva a cabo esta optimización? Sé que ahorraría muy poco para main, pero si esto también se hiciera con funciones normales, el efecto de ajustar innecesariamente el puntero de la pila en un ciclo masivo sería considerable.

El comando utilizado para generar la Asamblea fue:

gcc -O3 -std=c99 -S qq.c 
+0

¿Se puede incluir el comando completo invocando gcc? –

Respuesta

9

Puede habilitar esa optimización particular con el indicador del compilador . Hacerlo hace que la depuración sea imposible en algunas máquinas y sustancialmente más difícil en todo lo demás, por lo que generalmente está desactivada.

Aunque la documentación de GCC puede decir que está habilitado en los distintos niveles de optimización, es probable que encuentre que ese no es el caso-usted casi seguro que tiene que permitir explícitamente por sí mismo.

6

Encendido de (source) debe deshacerse de las manipulaciones de pila adicionales.

Aparentemente, GCC los dejó porque facilitan la depuración (obteniendo un seguimiento de pila cuando es necesario), aunque los documentos indican que es el valor predeterminado que comienza con GCC 4.6.

Cuestiones relacionadas